使用LINQ,我尝试使用db.Dishes.Remove(Dish);
但是当我删除该项目并插入一个新项目时,新项目的主键(id)"跳跃"价值。
E.g。
1 Shoes
2 Jeans //I delete this item
添加新项目时
1 Shoes
3 T-Shirt //jumps a value for Id
我也在DBContext.cs
modelBuilder.Entity<Cart>()
.HasOptional(i => i.Item)
.WithMany()
.WillCascadeOnDelete(true);
但它不能正常工作
有没有更好的方法从数据库中删除项目?
答案 0 :(得分:2)
问题在于,当我们使用DELETE时,它会从表中删除行,但计数器不会更改(如果删除的行有自动增量PK),请参阅DELETE vs TRUNCATE 。 因此,如果您想重用键值,那么您可以执行以下操作:
1)处理代码中Key的Auto Increment部分
2)如果你有 访问数据库或想要查询它的内容 可能有帮助(SQL Server):
DBCC CHECKIDENT ('tablename', RESEED, newseed)
从删除后的代码执行此操作:
db.ExecuteCommand("DBCC CHECKIDENT('tablename', RESEED, newseed);")
其中“newseed
”是已删除的row.eg的id,如果newseed为0,则下一次插入将为1,如果为10,则插入将为11.要获取新的种子值,您可以还获取驻留在数据库中的最大id值,然后从那里开始工作。如果您决定沿着这条道路走下去,请更好地了解您可以采取的方法。
来自Reset autoicrement in SQL Server以及如何在code中使用它。
答案 1 :(得分:0)
如果您的主键是自动整数,则无法避免此行为。这就是数据库的工作原理。如果要控制int值,请不要将其作为主键,也不要使用自动整数。而是使用uniqueidentifier作为主键,并使int成为普通字段。然后,当您创建新记录时,您需要有一个强大的机制来获取下一个索引,锁定它以便其他人无法窃取它,然后写下您的记录。
这在多线程环境中并非易事!你应该对这个主题做一些研究,然后提出一个好的方案。就个人而言,我永远不会尝试这样做,并会使用可重复的过程来生成非顺序或线程唯一的数字。
答案 2 :(得分:0)
主键必须是唯一的(根据定义),并且您还将其定义为标识列。
因此,当您删除某行并创建一个新行时,该新行将采用下一个可用键(在您的情况下为3个)。
如果您不想要这种行为,则必须自己管理主键的唯一性。