1

在用于实际项目之前,我正在努力更好地理解 Linq-to-SQL,所以我在一个小项目中使用它。我有一个表,我试图通过 DataContext.SubmitChanges() 更新它,但由于主键约束而失败。

我无法控制表本身(我无法添加实际的 ID 列),因此我修改了 Linq 实体以使用 3 列作为复杂键。即使关键数据在更新集和表中的现有数据中都是唯一的,插入仍然失败,我很想知道为什么。我错过了什么迫使 Linq 将这些值视为非唯一的?

请注意,我并没有尝试解决更新问题本身 - 我已经确定在我的情况下 DataContext.ExecuteCommand() 也可以正常工作。我试图弄清楚我对 Linq(或我的数据)的理解是错误的。

表结构如下所示: OPRID (char(30)) DATE (DateTime) PROJECT_ID (char(15)) HOURS (decimal)

最后 3 列是复杂键。

这是一些示例数据,逗号分隔:cschlege, 2009-1-5, 10100, 0.8 cschlege, 2009-1-5, 10088, 1.1 cschlege, 2009-1-5, 10099, 0.8 cschlege, 2009-1-5, 10088, 1.2

SubmitChanges() 在这些行的最后一个始终失败,但给定 DATE、PROJECT_ID、HOURS 的键,这些行应该是唯一的。它不会在第 3 行失败,该行在 HOURS 列中有重复,但只有在它到达重复的 PROJECT_ID 时才会失败。但是,如果我从复杂键中删除 PROJECT_ID,则插入在第 3 行失败。

为什么 LINQ 不将这些行视为唯一键控?

4

2 回答 2

1

鉴于您的解释,我猜想 HOURS(十进制)是问题所在……它必须以不同的精度进行映射。

如果 1.2 舍入到 1,那么您有以下问题:

cschlege, 2009-1-5, 10088, 1 (2)

cschlege, 2009-1-5, 10088, 1 (4)

正如您所说,如果您删除项目 ID,您最终会在第 3 行失败:

cschlege, 2009-1-5, 10100 , 0 (1)

cschlege, 2009-1-5, 10099 , 0 (3)

您可以只插入数据库中的最后一行,然后确认是1.2吗?

于 2009-01-15T19:18:06.317 回答
0

啊。答案是我没有足够关注后备商店的规则。有一个不同的索引实际上失败了。

于 2009-01-15T19:09:14.960 回答