【问题标题】:1-to-1 relationship causing exception: AssociationSet is in the 'Deleted' state. Given multiplicity constraints一对一关系导致异常:AssociationSet 处于“已删除”状态。给定多重约束
【发布时间】:2012-07-17 04:42:27
【问题描述】:

我首先按照此处规定的方法使用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"));
}

但是当我得到这个异常时......

“Asset_NewsItem”关联集中的关系处于“已删除”状态。给定多重约束,相应的“Asset_NewsItem_Source”也必须处于“已删除”状态。

每当这段代码运行时:

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

entry.Asset = new Asset();

_db.DbContext.SaveChanges();

如果我明确地将与 NewsItem 关联的先前资产标记为删除,我可以让事情正常工作,但它看起来有点不靠谱。看起来,根据映射,上面的代码应该可以简单地工作......用新资产替换旧资产。

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

【问题讨论】:

    标签: c# entity-framework entity-framework-4 one-to-one entity-framework-4.3


    【解决方案1】:

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

    【讨论】:

    • 看起来不太 ORM'ish 但我明白你在说什么。有没有更好的方法来映射允许简单地设置新资产的关系?或者唉,映射是否正确,我只需要处理它::) 谢谢。
    • 我刚刚遇到了同样的事情。非常令人沮丧。我相信 NHibernate 会像处理它一样处理这个问题。
    • .Clear() 应该清除。 Collection.Remove(item) 应该删除该项目。我不应该明确告诉 ORM 将其从数据库中删除——我应该告诉我的模型从集合中删除该项目。恕我直言
    • @MikeCole:首先,在处理一对一关系时没有集合。在我看来,没有正确的方法可以自动处理这种情况。您总能找到一种情况,您需要与框架使用的行为相反的行为。
    • @LadislavMrnka 请帮助我为什么在没有分配新资产的情况下出现同样的错误:stackoverflow.com/questions/23667190/…
    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多