2009-10-30 41 views
3

我遇到了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語句衝突與外鍵約束「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」?

回答

1

我的單元測試出現問題。

但我找到了問題的原因。問題是我的BC_Message_Assets表上的PK是基於2 FK(MessageId和AssetId)。用一個簡單的標識符(int + identity),它可以正常工作......奇怪!

0

正如你說你編程1,1,1卻得到了47,0,1

這是沒有預期值的2。

可能發生的一件事是,有一些其他代碼正在生成此行。當你保存它時首先保存錯誤行,這會拋出異常,並且你永遠不會看到你創建的行。

試着用你的問題中的代碼編寫單元測試。