在 C# Linq 表中保留唯一的主键
本文关键字:唯一 保留 Linq | 更新日期: 2023-09-27 17:56:13
我是第一次在 C# 的类中使用 Tables with Linq,所以如果我的术语不正确,请原谅我!一般来说,数据库也相对较新,所以让我知道这是否是我忽略的基本数据库概念。
我有一个类似于下面的"person"类,我定义了一个名为 Id 的列,它是主键 - 即它必须是唯一的。
我还指定了 isDbGenerated = true,这样我就不必手动指定此 ID。
[Table]
public class Person
{
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int Id;
...
}
当我向表中添加行时,这非常有用。
当我从表中删除行时,它会在行 ID 序列中留下空白。这很好。
当我尝试保存数据并将其重新加载到表中时,就会出现问题。为了保存数据,我手动将所需的信息写出到文本文件中。
当我将数据重新加载到表中时,自动生成的 ID 会覆盖我保存信息的原始 ID。这会导致我的较大数据库出现问题,该数据库通过其 ID 引用这些行。
例如。
我的数据库包含以下行:
- 编号、名称
- 1、约翰·
- 2、吉姆
- 4,标记(注意#3丢失,因为我在某个时候删除了它)
- 5、大卫
我将它们保存到文本文件中。我在另一个时间将它们从文本文件加载回空表中。
- 1、约翰·
- 2、吉姆
- 3、马克
- 4、大卫
IsDBGenerated 功能使这些数字是连续的。
我的最佳设置方法是什么,以便我可以将数据重新加载到表中,同时保留唯一 ID?
编辑:我认为使用自动生成的密钥并不能让我的生活更轻松。
自行生成要使用的下一个主键的最佳方法是什么?一个。只是在最后一个条目之后增加数字?b. 生成图形用户界面?C. 现有功能?
我不认为你真的错过了任何大概念。 您遇到了自动生成的密钥可能会遇到的固有问题。
在SQL Server(你使用的是SQL Server吗?)中,你可以使用一个名为身份插入的功能,该功能可以关闭(数据库自动编号,适合插入新记录)或打开(你必须提供数字,适合从文件加载)。
开/关的含义很容易混淆,因此请阅读文档 SET IDENTITY_INSERT。
至于如何在您的特定ORM上下文中执行此操作(是LINQ to SQL,实体框架吗?我不太确定 - 我在实践中对这个问题的回答是解决它(即不要让自己处于将自动生成的 ID 存储在我需要在应用程序逻辑上下文中加载的文本文件中的情况)。