我刚刚使用代码优先的方法将我们的项目从MVC4和EF5更新为MVC5和EF6,我遇到了一个我不记得在旧版本中发生过的潜在问题。在更新单个实体时,我收到一个db错误,它抱怨子实体中的属性无效。我检查了模型,并且该子实体没有设置虚拟属性。所以我想知道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语法——我倾向于使用更详细的"from"语法。作为测试,我删除了includes,一切都很好。
使用".Include"语法可能与我看到的行为有关,或者EF真的在尝试自动更新子实体吗?
EF将假定实体上的所有集合/复杂类型都是导航属性。Virtual不需要映射导航属性,它只允许延迟加载该导航属性。
如果要将复杂类型/集合排除为nav属性,请使用[NotMapped]
属性或.Ignore(t => t.PropertyName)
建模器lambda