【发布时间】: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