【问题标题】:LINQ to SQL: inserting child entity fails because ID is not included in SQL?LINQ to SQL:插入子实体失败,因为 SQL 中不包含 ID?
【发布时间】:2019-09-06 12:34:46
【问题描述】:

我正在通过分配一个 LINQ-to-SQL 实体的子实体对数据库进行非常简单的插入,但它在外键上失败了。

代码是:

var imageStripFileAltText = new ImageStripFileAltText();
imageStripFileAltText.Alt = "alt text";
imageStripFile.ImageStripFileAltText = imageStripFileAltText;
db.SubmitChanges();

imageStripFile 是一个自定义类型ImageStripFile,在数据库中有对应的表。
db 是一个DataContext。

当我在调试器中检查imageStripFile.ImageStripFileAltText 时,我看到它已经分配了正确的外键Id,即imageStripFile 的主键。但是,我得到以下异常:

System.Data.SqlClient.SqlException: 'INSERT 语句冲突 带有 FOREIGN KEY 约束 “FK_ImageStripFileAltText_ImageStripFile”。冲突发生在 数据库“Cms”,表“dbo.ImageStripFile”,列“Id”。

由于我确定了具有相应 ID 的 ImageStripFile 存在,这让我感到困惑,直到我检查了生成的 SQL:

DECLARE @p0 NVarChar(4000) = 'alt text' 
INSERT INTO [dbo].[ImageStripFileAltText]([Alt])
VALUES (@p0)

生成的SQL不包含参数中的ID!

我做错了什么?

我也试过直接分配外键ID:

var imageStripFileAltText =
    new ImageStripFileAltText() { ImageStripFileId = imageStripFile.Id };

但结果是一样的。

编辑:如果我从子表的主键中删除 IsIdentity 属性(我现在认为这是正确的情况),我会得到一个不同的异常:

System.Data.SqlClient.SqlException: '无法将值 NULL 插入 列“ImageStripFileId”,表“Cms.dbo.ImageStripFileAltText”; 列不允许空值。插入失败。

请注意,这也与生成的 SQL 相对应。

【问题讨论】:

  • 在提交更改之前添加dc.ImageStripFileAltText.InsertOnSubmit(imageStripFileAltText);是否有效?
  • 不,我得到完全相同的结果。
  • 与其设置id试试imageStripFileAltText.ImageStripFile = imageStripFile;。您是否有多个数据上下文(即在一个中加载 imageStripFile 并尝试将 ImageStripFileAltText 保存在另一个中?
  • 将父级设置在子级上与将子级设置在父级上的结果相同。我在这个方法中只使用了一个数据上下文。
  • 最后的建议。下载 LinqPad(来自linqpad.net)并让它从您的数据库中构建模型并尝试您的代码。如果它在 LinqPad 中有效,则表明您的模型有问题。

标签: c# asp.net linq-to-sql


【解决方案1】:

在我的场景中,我的表中的 PK 字段没有自动递增,即 IsIdentity 设置为 false。尝试在您的表格中检查这一点。

【讨论】:

  • 我的 PK 是 Identity,但它不是自动递增的,因为它是一个外键(即它存在于另一个表中)。
  • 被引用为 FK 的表的 PK。
  • 是的,绝对是两者兼而有之。事实上,这是一张非常古老的桌子,已经使用了多年。只有 ImageStripFileAltText 表是新的。
  • 您是否尝试过显式设置 ImageStripFile 表的 Id 字段?
  • 可以,但是生成的SQL还是不包含它。
【解决方案2】:

哇。我在开发数据库上构建模型并在生产数据库上执行代码,ImageStripFileAltText 表在其上的方案略有不同(可能与 IsIdentity 相关?),因为我在编写代码时仍在修补它.

长话短说:代码很好;别傻了,努力工作吧。

【讨论】:

    【解决方案3】:

    IsIdentity 需要设置ID为true并设置自增

    【讨论】:

    • 不在这里,因为是外键;它的值来自另一个表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多