EF6 MVC5为什么LINQ试图更新虚拟链接的子实体?

时间:2014-04-09 13:22:27

标签: asp.net-mvc linq entity-framework

我刚刚使用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是否真的试图自动更新子实体?

1 个答案:

答案 0 :(得分:4)

EF将假设实体上的所有集合/复杂类型都是导航属性。 不需要映射导航属性,它只是允许延迟加载导航属性。

如果要将复杂类型/集合排除在变为导航属性之外,请使用[NotMapped]属性或.Ignore(t => t.PropertyName)模型构建器lambda