在实体框架中添加唯一索引会阻止 DataTables 显示工作

Posted

技术标签:

【中文标题】在实体框架中添加唯一索引会阻止 DataTables 显示工作【英文标题】:Adding unique index in Entity Framework prevents DataTables display working 【发布时间】:2017-01-18 17:13:11 【问题描述】:

这是一个非常简单的结构 - 具有外键 1 到多个的父子节点。

工作正常,但我想通过添加复合唯一索引来强制唯一性:

CreateIndex("dbo.Fixtures", new[]  "MarketId", "BookName", "CoupName" , unique: true, name: "IX_UniqueFixture");

之后,当我输入新记录时,它产生了错误:

然后我删除了新添加的索引并删除了添加索引后添加的记录,它可以显示添加索引之前的记录。

但是,当我再次尝试使用新记录更新数据库时,它恢复到相同的错误:

错误消息下方显示的记录是在添加前面提到的索引之前存在的记录。

现在在重新设置父查找表 ID 列之后 - 它可以工作

USE [aspnet-Arb-20160906102730] 

去 DBCC CHECKIDENT ('ExchangeTypes', RESEED, 7) 去吧

它再次允许我添加新记录

简而言之,我设法通过添加唯一复合索引从混乱的数据表中恢复过来,以便显示记录。

但是,这让我很困惑为什么会发生这种情况。而且我仍然希望能够强制执行唯一性。也许我会尝试将 3 个字段连接到一个字段中,看看我是否可以通过在单个字段上而不是多个字段上的索引来强制唯一性,看看这是否不会干扰数据表的显示。

编辑:在单个字段唯一的索引上尝试过它,但仍然出现相同的错误。有趣的是,如何在父查找字段上应用唯一索引并不会阻止数据表工作,但在子表上尝试相同。

【问题讨论】:

【参考方案1】:

编辑 3 看起来可以通过变通方法解决

我从来不知道这会像这样愚蠢地不可预测初始测试,除非它以某种方式中断,因为我只测试过一次,删除和随后添加记录。无论如何,祈祷它是一个合适的解决方法,除非有人能够深入了解它并提供更好的解决方案。

看起来我每次执行删除时都必须运行这段代码 - 每次删除后将最大标识值重置为等于 PK.ID 列中的当前标识值,如下所示:

DECLARE @maxIdentityETValue INT
DECLARE @maxIdentityFValue INT

SET @maxIdentityETValue = (SELECT MAX(Id) FROM ExchangeTypes)
DBCC CHECKIDENT('ExchangeTypes', RESEED, @maxIdentityETValue)

SET @maxIdentityFValue = (SELECT MAX(Id) FROM Fixtures)
DBCC CHECKIDENT('Fixtures', RESEED, @maxIdentityFValue)

DBCC CHECKIDENT ('ExchangeTypes', NORESEED) 
DBCC CHECKIDENT ('Fixtures', NORESEED)

编辑 2 未解决。

尝试删除然后添加记录,进一步删除它不会再显示任何后续添加。 :(

查看身份生成的 ID 值中的步骤 - 这就是导致问题的原因 - 至少如果我在删除后和随后添加记录之前不重新设置这些数字,那么 Datatables 会显示新记录。但是,如果我不进一步重新设置它们以删除记录并且在随后添加记录之前,它仍然会阻止数据表显示记录并显示上述错误。

令人抓狂 - 有人请帮助我!


编辑 1:已解决。好样的。

添加索引时,至少是唯一索引,有必要为父和子 PK Identity 生成的 ID 值重新设定种子,以便数据表正常工作 - 显示无错误的记录。

不要问我为什么,但它确实有效。

除了分别在索引、父索引和子索引中添加我的唯一强制约束之外,我在按照描述重新设置两个身份列之后,我现在可以向数据库添加新记录并且数据表可以很好地显示它们。

【讨论】:

以上是关于在实体框架中添加唯一索引会阻止 DataTables 显示工作的主要内容,如果未能解决你的问题,请参考以下文章

使用实体框架添加唯一数据

Laravel Yajra DataTable:如何在对其他列进行排序时阻止索引列(具有行序列号)发生变化

如何阻止实体框架尝试保存/插入子对象?

为啥使用参数化查询或实体框架会阻止 sql 注入?

具有过滤索引的实体框架 - “无法在对象中插入重复的键行”

在Code第一实体框架中将DbContext转换为Datatable