一对一关系导致异常:AssociationSet处于“已删除”状态。考虑到多重性约束。

10

我使用EF code first按照这里建议的方法建立了一个一对一的关系:

在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' AssociationSet的关系处于“已删除”状态。鉴于多重性约束,相应的'Asset_NewsItem_Source'也必须处于“已删除”状态。

每当这段代码运行时:

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

entry.Asset = new Asset();

_db.DbContext.SaveChanges();

如果我明确标记与NewsItem相关联的先前Asset以进行删除,我可以使它们正常工作。但是这似乎有点奇怪。根据映射,上述代码应该只需工作...用新的Asset替换旧的。

我做错了什么吗?在映射中是否需要指定某些内容才能使事情正常工作?还是,删除并添加关联对象就是EF的方式?

1个回答

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

3
看起来不是非常符合ORM的风格,但我理解你的意思。是否有更好的映射关系可以允许简单地设置新资产?或者遗憾的是,映射是正确的,我只需要处理它呢?:)谢谢。 - wgpubs
1
我也遇到了同样的问题,非常令人沮丧。我相信NHibernate会像应该处理的那样处理它。 - Mike Cole
3
.Clear()应该清空集合。Collection.Remove(item) 应该移除集合中的元素。不需要显式地告诉ORM从数据库中删除它 - 应该告诉模型从集合中移除该元素。 我个人认为如此。 - Mike Cole
1
@MikeCole:首先,在处理一对一关系时,不存在集合。在我看来,没有一种自动处理此场景的正确方式。您总是可以找到需要与框架使用相反行为的情况。 - Ladislav Mrnka
1
@LadislavMrnka 请帮忙解释一下,为什么在没有分配新资产的情况下,我会得到相同的错误:http://stackoverflow.com/questions/23667190/identity-usermanager-addtorole-throws-exception - Serj Sagan
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接