C#WPF使用datagrid从数据库中删除主键及其主键

时间:2015-12-05 14:41:02

标签: c# wpf entity-framework linq

使用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);

但它不能正常工作

有没有更好的方法从数据库中删除项目?

3 个答案:

答案 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个)。

如果您不想要这种行为,则必须自己管理主键的唯一性。