导致异常的1对1关系:AssociationSet处于"已删除"状态.给定多重约束

wgp*_*ubs 10 c# entity-framework one-to-one entity-framework-4 entity-framework-4.3

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

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

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Asset>()
        .HasRequired(i => i.NewsItem)
        .WithOptional(e => e.Asset)
        .Map(m => m.MapKey("NewsItemId"));
}
Run Code Online (Sandbox Code Playgroud)

但是当我得到这个例外......

来自'Asset_NewsItem'AssociationSet的关系处于'已删除'状态.给定多重约束,相应的'Asset_NewsItem_Source'也必须处于'已删除'状态.

每当此代码运行时:

var entry = _db.NewsItems.Find(id);

entry.Asset = new Asset();

_db.DbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

如果我明确标记与NewsItem相关联的先前资产以进行删除,我可以得到一些工作,但它看起来有点不稳定.看起来,基于映射,上面的代码应该简单地工作...用新的资产替换旧的资产.

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

Lad*_*nka 8

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

  • 似乎不是很ORM'ish但我明白你在说什么.有没有更好的方法来映射允许简单设置新资产的关系?或者唉,映射是正确的,我只需要处理它::)谢谢. (3认同)
  • `.Clear()`应该清除.`Collection.Remove(item)`应删除该项.我不应该明确告诉ORM将其从数据库中删除 - 我应该告诉我的模型从集合中删除该项目.恕我直言 (3认同)