我刚刚使用Code-first方法将我们的项目从MVC4和EF5更新为MVC5和EF6,我遇到了一个潜在的问题,我不记得在旧版本中发生过这种情况。 更新单个实体时,我收到了一个db错误,该错误在一个子实体中抱怨一个无效的属性。我检查了模型,这个子实体没有设置VIRTUAL属性。所以我想知道为什么EF会试图更新孩子?
以下是我要更新的模型:
public class Subscriber
{
[Required]
[Display(Name = "Subscriber ID")]
public int SubscriberId { get; set; }
public virtual List<UserProfile> Users { get; set; }
public List<Website> Websites { get; set; }
}
我所指的网站属性。
以下是行动代码:
Subscriber subscriber = db.Subscribers
.Include(s => s.Websites.Select(w => w.DomainNames))
.Single(s => s.SubscriberId == FormSubscriberID);
subscriber.InjectFrom(viewModel, subscriber); //sets the values from the viewModel
db.Entry(subscriber).State = EntityState.Modified;
db.SaveChanges();
我通常不会在查询中使用include语法 - 我倾向于使用更详细的&#39;来自&#39;句法。作为测试,我删除了包含,一切正常。
可以使用&#39; .Include&#39;语法与我看到的行为有关,或者EF是否真的试图自动更新子实体?
答案 0 :(得分:4)
EF将假设实体上的所有集合/复杂类型都是导航属性。 不需要映射导航属性,它只是允许延迟加载导航属性。
如果要将复杂类型/集合排除在变为导航属性之外,请使用[NotMapped]
属性或.Ignore(t => t.PropertyName)
模型构建器lambda