在Entity Framework中添加唯一索引可防止DataTables显示工作

这是一个非常简单的结构 – 父子,外键1对多。

工作正常但我想通过添加复合唯一索引来强制执行唯一性,如下所示:

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

在此之后,当我输入新记录时,它产生了错误: 在此处输入图像描述

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

但是,当我再次尝试使用新记录更新数据库时,它还原为同样的错误:

在此处输入图像描述

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

现在重新播种父查找表Id列后 – 它可以工作

 USE [aspnet-Arb-20160906102730] 


DBCC CHECKIDENT(’ExchangeTypes’,RESEED,7)GO

它再次允许我添加新记录

在此处输入图像描述

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

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

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

编辑3看起来像可以解决方法

我从来不知道这可能是如此愚蠢的不可预测,因为它认为它只会照顾自己的自动增量,并且从未想象它会对Datatables行显示产生如此严重的影响,但任何看起来这样的情况都可以用于初始测试,除非它以某种方式打破,因为我只测试了一次删除和随后添加的记录。 手指越过它是一个合适的工作无论如何,除非有人可以到达它的底部并提供更好的解决方案。

看起来我每次执行删除时都必须运行这段代码 – 在每次删除后将最大标识值重置为等于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未解决。

尝试删除然后添加记录并进一步删除它将不允许再显示任何后续添加。 🙁

请参阅Identity生成的ID值中的升级 – 这就是造成问题的原因 – 至少如果我在删除后没有重新设置这些数字,然后再添加记录,那么Datatables会显示新记录。 但是,如果我不再将它们重新设置为删除记录,并在随后添加记录之前仍然阻止数据表显示记录并显示上述错误。

疯狂 – 有人请帮助我!

在此处输入图像描述


编辑1:解决了。 好吧。

在添加索引时,至少是一个唯一索引,有必要重新设置父PK和父PK生成的ID值,以便数据表工作 – 显示记录无错误。

不要问我为什么,但它只是有效。

除了分别在索引,父级和子级中添加我的唯一强制约束之外,我在将两个标识列重新设置为descibed之后,我现在能够向数据库添加新记录,并且数据表显示它们很好。