我首先按照此处规定的方法使用EF代码设置一对一的关系:
Unidirectional One-To-One relationship in Entity Framework
我的映射看起来像这样......
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Asset>()
.HasRequired(i => i.NewsItem)
.WithOptional(e => e.Asset)
.Map(m => m.MapKey("NewsItemId"));
}
但是当我得到这个例外......
来自&#39; Asset_NewsItem&#39;的关系AssociationSet位于&#39;已删除&#39;州。给定多重约束,相应的“Asset_NewsItem_Source”#39;还必须在“删除”中删除。状态。
每当此代码运行时:
var entry = _db.NewsItems.Find(id);
entry.Asset = new Asset();
_db.DbContext.SaveChanges();
如果我明确标记与NewsItem相关联的先前资产以进行删除,我可以开始工作,但它看起来有点不稳定。看起来,基于映射,上面的代码应该简单地工作......用新的资产替换旧的资产。
我做错了吗?我需要在映射中指定一些能让事情正常运行的东西吗?或者,它只是EF方式必须删除然后添加这样的关联对象?
答案 0 :(得分:8)
这是EF的工作方式。您已加载包含相关资产的条目,并且知道您要分配新资产。此操作会使您的旧资产与任何条目无关,但您的映射不允许(您指定Asset
必须具有相关Entry
)。因此,在分配新资产以满足映射约束之前,您必须删除旧资产或将其分配给另一个条目。