实体框架 4 纯代码错误 "不支持每种类型的多个对象集"

17

我有两个使用EF4和最新CTP的“仅代码”POCO,针对一个现有的遗留数据库运行。对PocoA运行LINQ查询是可以的,直到我向该对象添加下面的属性,我尝试添加关系。

public virtual PocoB pocoB { get; set; }

在我这样做之后,我开始收到以下错误:

不支持每种类型的多个对象集。对象集“PocoA_DbSet”和“PocoB_DbSet”都可以包含类型为“PocoA”的实例。

于是我接下来认为我的问题是因为我没有定义关系,并且这个遗留数据库在主键和外键上使用了“fk/pk”前缀而不是“Id”后缀。所以我添加了以上虚拟方法中的数据注释,但行为没有变化:

[RelatedTo(Property="PocoB", ForeignKey="fkPocoB")]

我真的不知道需要改变什么才能让它工作。


你能提供你的PocoAPocoB类吗?还有任何相关的映射类。 - Charlino
5
找到问题了。这是一个打字错误。我的PocoB的DbSet类被声明为DbSet<PocoA> - Donald Hughes
15
你应该把你的解决方案发表在答案中并接受它……这样就能把这个问题从未回答的列表中移除啦 :) - forsvarir
1
同意,没有什么比到这一步发现问题已经解决更让人恼火的了。 :( - Christo
1个回答

47

如果您的DbContext类公开了多个DbSet<T>属性,并且T出现了一次以上,则会出现此错误。基本上无法确定类型为T的实例属于哪个DbSet。

在代码中,错误可能看起来像这样:

public class MyContex : DbContext {
    public DbSet<PocoA> PocoA { get; set; }
    public DbSet<PocoA> PocoB { get; set; } ...

最后一行应该是DbSet<PocoB>而不是DbSet<PocoA>

简单来说 - 你复制粘贴了一个属性,却忘记在DbSet中改变类型参数


1
感谢您的跟进,帮我省去了一场头痛 :) - J. Mitchell
2
刚刚因为复制粘贴而遭受了同样的问题,这让我节省了一些时间。 - joelmdev
同样的问题。我也是这么做的...复制粘贴! - Vijay Chavda

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