如何在EF中取消对导航属性关联实体的变更追踪?
问题描述
我的部分实体因存在指向数据库中另一实体的外键而拥有导航属性。我在代码中通过设置导航属性的主键来关联实体,但Entity Framework(EF)将该关联实体视为新实体,尝试将其插入数据库时触发报错:
Cannot insert explicit value for identity column in table 'xxx' when IDENTITY_INSERT is set to OFF.
显然,这是因为该实体为新建对象,并非从数据库获取。请问是否有办法在EF中取消对该实体的变更追踪?
解决方法
以下几种方式可让EF不对关联实体进行变更追踪,避免触发不必要的插入操作:
标记实体为Unchanged状态
通过DbContext的Entry方法,将关联实体的状态设置为EntityState.Unchanged,明确告知EF该实体已存在于数据库中:var relatedEntity = new RelatedEntity { Id = 123 }; // 已设置主键的关联实体 context.Entry(relatedEntity).State = EntityState.Unchanged; mainEntity.RelatedEntity = relatedEntity; context.MainEntities.Add(mainEntity); context.SaveChanges();使用Attach方法附加实体
调用DbSet的Attach方法,将新建的关联实体附加到上下文,EF会默认将其判定为已存在的实体(状态为Unchanged):var relatedEntity = new RelatedEntity { Id = 123 }; context.RelatedEntities.Attach(relatedEntity); mainEntity.RelatedEntity = relatedEntity; context.MainEntities.Add(mainEntity); context.SaveChanges();直接设置外键属性
如果主实体有对应的外键字段(比如RelatedEntityId),直接赋值该外键值,无需实例化导航属性对象,这是最直接规避误判的方式:mainEntity.RelatedEntityId = 123; context.MainEntities.Add(mainEntity); context.SaveChanges();
内容的提问来源于stack exchange,提问作者Wouter
相关产品推荐
相关产品推荐

