实体框架和 FK 问题再次出现

Posted

技术标签:

【中文标题】实体框架和 FK 问题再次出现【英文标题】:Yet again Entity Framework and FK problems 【发布时间】:2010-02-06 20:48:32 【问题描述】:

我有一个有两个 fk 的实体。我一直在尝试向数据库插入一条记录,但没有成功。这是我使用的方法:

    valuePaymentBetToAdd.BetType = db.BetTypes.First(betType => betType.Id == valuePaymentBetToAdd.BetType.Id);
    valuePaymentBetToAdd.Lottery  = db.Lotteries.First(lotto => lotto.Id == valuePaymentBetToAdd.Lottery.Id);

在这种情况下,第二个对象被分配,但在调用 SaveChanges 方法时,我收到一个错误,指出 Lottery 对象的属性为空。

    valuePaymentBetToAdd.BetTypeReference.EntityKey = new EntityKey(db.DefaultContainerName + ".BetType", "Id", valuePaymentBetToAdd.BetType.Id);
    valuePaymentBetToAdd.LotteryReference.EntityKey = new EntityKey(db.DefaultContainerName + ".Lottery", "Id", valuePaymentBetToAdd.Lottery.Id);

在这种情况下,我得到另一个奇怪的错误。当对象被添加到集合中时。

无法添加或附加该对象,因为其 EntityReference 的 EntityKey 属性值与该对象的 EntityKey 不匹配。

在这种情况下我错过了什么吗?

【问题讨论】:

请显示您用于插入的完整代码,而不仅仅是这两行。你展示的两种方法都很好。您的错误在其他地方。我的疯狂猜测是您使用了多个 ObjectContext,但如果不看代码就很难判断。 【参考方案1】:

尝试像这样设置 EntityReference:

valuePaymentBetToAdd.BetTypeReference.EntityKey = b.BetTypes.First(betType => betType.Id == valuePaymentBetToAdd.BetType.Id).EntityKey;

对我有用

【讨论】:

【参考方案2】:

如何为 BetType 和 Lottery 创建一个存根对象,您只设置 Id 属性,然后将它们附加到它们各自的 EntitySets,然后在您的 Bet 对象上设置这些对象,然后保存 - 类似于:

Lottery lottery = new Lottery()  Id = valuePaymentBetToAdd.Lottery.Id ;
BetType betType = new BetType()  Id = valuePaymentBetToAdd.BetType.Id ;

MyContext.AttachTo("Lottery", lottery);
MyContext.AttachTo("BetType", betType);

valuePaymentBetToAdd.Lottery = lottery;
valuePaymentBetToAdd.BetType = betType;

MyContext.AddToBet(valuePaymentBetToAdd);
MyContext.SaveChanges();

【讨论】:

当我附上这个时,它似乎试图在表格上插入一个新行。

以上是关于实体框架和 FK 问题再次出现的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在实体框架中将表FK链接到另外两个PK?

实体框架Fluent API中的两个FK

尝试添加项目时在实体框架中出现错误

在 SaveChanges 的实体框架中出现错误

使用默认成员关系的 MVC3 实体框架

实体框架:更新连接表