实体框架,外键和实体键

时间:2009-10-30 09:56:45

标签: c# .net entity-framework

我遇到了Entity Framework和ForeignKeys的问题。 我有一个表“BC_Message_Assets”,它有3个FK(MessageId,AssetId和StatusId)。 我像这样创建我的“MessageAsset”

MessageAsset messageAsset = new MessageAsset();

messageAsset.MessageStatusReference.EntityKey = new EntityKey("MyEntities.MessageStatusSet", "Id", 1);

messageAsset.AssetReference.EntityKey = new EntityKey("MyEntities.AssetSet", "Id", 1);

messageAsset.MessageReference.EntityKey = new EntityKey("MyEntities.MessageSet", "Id", messageId);

context.AddToMessageAssetSet(messageAsset);
context.SaveChanges();

但我得到以下例外:

  

INSERT语句与FOREIGN KEY约束“FK_BC_Message_Assets_BC_Assets”冲突。冲突发生在数据库“Test”,表“dbo.BC_Assets”,列“Id”中。   声明已经终止。

当我查看查询时,我注意到AssetId的参数值为“0”,尽管我向EntityKey提供了“1”。这是生成的查询:

exec sp_executesql N'insert dbo.[BC_Message_Assets]([MessageId], [AssetId], [CompletionTime], [StatusId]) values (@0, @1, null, @2) ',N'@0 int,@1 int,@2 int',@0=47,@1=0,@2=1

我无法解释会发生什么。我在EntityKey中硬编码“1”,我在查询中收到“0”?

2 个答案:

答案 0 :(得分:1)

我的单元测试存在问题。

但我找到了问题的原因。问题是我的BC_Message_Assets表上的PK基于2 FK(MessageId和AssetId)。使用简单的标识符(int + identity),它可以正常工作......奇怪!

答案 1 :(得分:0)

如你所说,你编程1,1,1但得到了47,0,1

这是两个不期望的值。

可能发生的一件事是,还有一些其他代码正在生成此行。保存时,首先保存包含错误的行,这会引发异常,并且您永远不会看到您创建的行。

尝试仅使用问题中的代码编写单元测试。