2016-04-29 13 views
0

Я пытаюсь обновить строку в своей таблице bu.LastReviewCreationDate = LastReviewCreationDate;, но это действие генерирует исключение DbEntityValidationException.Получение DbEntityValidationException, когда я пытаюсь обновить строку в таблице, используя структуру сущности

 public void UpdateLastReviewCreationDate(string idBusiness, DateTime LastReviewCreationDate,string urlSite) { 
 

 
      DAL.Business bu; 
 
      try { 
 
       using (DBContext tpContext = new DBContext()) 
 
       { 
 
        bu = tpContext.business.Find(idBusiness, urlSite); 
 
        if (bu != null) 
 
        { 
 
         bu.LastReviewCreationDate = LastReviewCreationDate; 
 
         tpContext.SaveChanges(); 
 
        } 
 
       } 
 
      } 
 
      catch (DbEntityValidationException e) 
 
      { 
 
       foreach (var eve in e.EntityValidationErrors) 
 
       { 
 
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
 
         eve.Entry.Entity.GetType().Name, eve.Entry.State); 
 
        foreach (var ve in eve.ValidationErrors) 
 
        { 
 
         Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", 
 
          ve.PropertyName, ve.ErrorMessage); 
 
        } 
 
       } 
 
       throw; 
 
      } 
 
     }

Так это то, что я получил в отладчике: enter image description here

Это означает, что эта таблица только для чтения и не дают возможность редактирования. Но я никогда не устанавливал эту таблицу в режиме «Только для чтения», это действительно странно. Это код этой таблицы.

public class Business 
 
    { 
 
     public Business() 
 
     { 
 
      LastReviewCreationDate = new DateTime(); 
 
     } 
 

 
     [Key, Column(Order = 0)] 
 
     public string Id { get; set; } 
 

 
     [Key, Column(Order = 1)] 
 
     [ForeignKey("site")] 
 
     public string SiteId { get; set; } 
 

 
     public string UrlBusiness { get; set; } 
 
     public DateTime LastReviewCreationDate { get; set; } 
 

 
     [Required] 
 
     public virtual Site site { get;set;} 
 
     public virtual BusinessUser businessUser{get;set;} 
 

 
    }

Может быть, у кого есть идеи? И возможно ли, что сброс IsReadOnly параметра на false?

+0

IsReadOnly - это флаг в записи, которую вы можете установить. Однако должно быть что-то еще неправильно. вы уверены, что ваша собственность в вашем контексте - это DbSet ? как он настроен (свободный API?) – DevilSuichiro

+0

У меня есть 'public DbSet business {get; задавать; } 'в моем контексте. – Stephane

+0

Как этот dbset (например, контекст) настроен относительно этого dbset? Я знаю, что вы можете установить readonly на свою запись (-set), однако стандартное поведение DbContext не является данными только для чтения. – DevilSuichiro

ответ

1

Наконец, я исправил эту проблему самостоятельно. Это исключение, что я поймала:

Property: location, Error: The site field is required. 

, потому что я установил поля в требуемое свойство для сайта, поэтому каждый раз, когда я хочу, чтобы обновить эту таблицу, даже если стоимость сайта не должны быть изменены, это всегда нужно чтобы получить код клиента.

public class Business 
 
    { 
 
     public Business() 
 
     { 
 
      LastReviewCreationDate = new DateTime(); 
 
     } 
 

 
     [Key, Column(Order = 0)] 
 
     public string Id { get; set; } 
 

 
     [Key, Column(Order = 1)] 
 
     [ForeignKey("site")] 
 
     public string SiteId { get; set; } 
 

 
     public string UrlBusiness { get; set; } 
 
     public DateTime LastReviewCreationDate { get; set; } 
 

 
     [Required] 
 
     public virtual Site site { get;set;} 
 
     public virtual BusinessUser businessUser{get;set;} 
 

 
    }

Так исправить эту проблему, просто добавляя bu.site = siteE; перед тем tpContext.SaveChanges();

 public void UpdateLastReviewCreationDate(string idBusiness, DateTime LastReviewCreationDate,string urlSite) { 
 

 
      DAL.Business bu; 
 
      try { 
 
       using (DBContext tpContext = new DBContext()) 
 
       { 
 
        bu = tpContext.business.Find(idBusiness, urlSite); 
 
        DAL.Site siteE = bu.site; 
 
        if (bu != null) 
 
        { 
 
         bu.LastReviewCreationDate = LastReviewCreationDate; 
 
         bu.site = siteE; 
 
         tpContext.SaveChanges(); 
 
        } 
 
       } 
 
      } 
 
      catch (DbEntityValidationException e) 
 
      { 
 
       foreach (var eve in e.EntityValidationErrors) 
 
       { 
 
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
 
         eve.Entry.Entity.GetType().Name, eve.Entry.State); 
 
        foreach (var ve in eve.ValidationErrors) 
 
        { 
 
         Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"", 
 
          ve.PropertyName, ve.ErrorMessage); 
 
        } 
 
       } 
 
       throw; 
 
      } 
 
     }

надеюсь, что это поможет.

0

Существует некоторая проверка валидации базы данных, которая препятствует записи данных в нее. На самом деле вы должны увидеть ошибки, если в процессе тестирования вы развернете этот массив в Visual Studio. Но вы также можете поймать исключение, а затем вычесть ошибки в каком-то хранилище или консоли: