10

我首先按照此处规定的方法使用 EF 代码建立了一对一的关系:

实体框架中的单向一对一关系

我的映射看起来像这样......

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 关联的先前资产标记为删除,我可以让事情正常工作,但它似乎有点不稳定。看起来,基于映射,上面的代码应该可以简单地工作......用新的资产替换旧的资产。

难道我做错了什么?我需要在映射中指定什么东西才能让事情正常工作吗?或者,它只是必须删除然后添加这样的关联对象的 EF 方式吗?

4

1 回答 1

8

这就是 EF 的工作方式。您已经加载了一个包含相关资产的条目,现在您想要分配一个新资产。此操作将使您的旧资产与任何条目无关,但您的映射不允许这样做(您指定Asset必须有相关Entry)。因此,在分配新资产以满足映射约束之前,您必须删除旧资产或将其分配给另一个条目。

于 2012-07-17T09:29:18.427 回答