我使用EF code first按照这里建议的方法建立了一个一对一的关系:
我的映射看起来像这样...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Asset>()
.HasRequired(i => i.NewsItem)
.WithOptional(e => e.Asset)
.Map(m => m.MapKey("NewsItemId"));
}
但是当我遇到这个异常时...
从'Asset_NewsItem' AssociationSet的关系处于“已删除”状态。鉴于多重性约束,相应的'Asset_NewsItem_Source'也必须处于“已删除”状态。
每当这段代码运行时:
var entry = _db.NewsItems.Find(id);
entry.Asset = new Asset();
_db.DbContext.SaveChanges();
如果我明确标记与NewsItem相关联的先前Asset以进行删除,我可以使它们正常工作。但是这似乎有点奇怪。根据映射,上述代码应该只需工作...用新的Asset替换旧的。
我做错了什么吗?在映射中是否需要指定某些内容才能使事情正常工作?还是,删除并添加关联对象就是EF的方式?
.Clear()
应该清空集合。Collection.Remove(item)
应该移除集合中的元素。不需要显式地告诉ORM从数据库中删除它 - 应该告诉模型从集合中移除该元素。 我个人认为如此。 - Mike Cole