3

У меня возникают проблемы с обновлением свойства класса, когда класс содержит виртуальные свойства. Вот мой кодОшибка проверки структуры Entity Framework при обновлении класса с виртуальными свойствами

public class Policy 
      { 
       [Key] 
       [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
       public long id { get; set; } 

       [UIHint("Company"), Required] 
       public virtual Company company { get; set; } 

       [UIHint("Productor"), Required] 
       public virtual Productor productor { get; set; } 

       [MaxLength(1000)] 
       public string comments { get; set; } 
      } 

     public class Company 
     { 
      [Key] 
      [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
      public long id { get; set; } 

      [MaxLength(100)] 
      public string name { get; set; } 

     } 

    //Then Productor class is the same as company but with another name 

    public static int updateComment(long id, string comments) 
      { 
       MemberPolicies mp = new MemberPolicies(); 

       Policy p = mp.Policies.Single(o => o.id == id); 
       p.comments = comments; 

       int afectedRecords = -1; 
       try 
       { 
        afectedRecords = mp.SaveChanges(); 
       } 
       catch (DbEntityValidationException dbEx) 
       { 
        foreach (var validationErrors in dbEx.EntityValidationErrors) 
        { 
         foreach (var validationError in validationErrors.ValidationErrors) 
         { 
          Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); 
         } 
        } 
       } 
       return afectedRecords; 
      } 

Свойства, вызывающие ошибки проверки, являются компанией и компанией, но я хочу только обновить комментарий к свойствам.

Некоторая помощь может быть оценена.

Благодаря

+1

Возможный дубликат [Изменение свойства объекта в Entity Framework вызывает ошибку проверки] (http://stackoverflow.com/questions/8784005/modifying-a-property-on-entity-in-entity-framework -causes-проверки ошибок) – Eranga

ответ

1

EF не ленивые нагрузки виртуальных свойств при попытке сохранить объект (черт его). Вы можете выполнить одно из следующих действий.

Используйте команды:

Policy p = mp.Policies 
    .Include(p => p.company) 
    .Include(p => p.productor).Single(o => o.id == id); 
p.comments = comments; 

Или использовать Load:

Policy p = mp.Policies.Single(o => o.id == id); 
p.comments = comments; 
mp.Entry(p).Reference(p => p.company).Load(); 
mp.Entry(p).Reference(p => p.productor).Load(); 

Или лучше вы можете написать более элегантный код, как описано here.