【问题标题】:Entity Framework, Foreign Keys and EntityKeys实体框架、外键和实体键
【发布时间】:2009-10-30 09:56:45
【问题描述】:

我遇到了实体框架和外键的问题。 我有一个表“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”?

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    我的单元测试有问题。

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

    【讨论】:

      【解决方案2】:

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

      有 2 个值不是预期的。

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

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

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多