0

我是在 C# 的类中使用带有 Linq 的表的新手,如果我的术语不正确,请原谅我!一般来说,数据库也相对较新,所以如果这是我忽略的基本数据库概念,请告诉我。

我有一个类似于下面的“人”类,并且我定义了一个名为 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 的同时将数据重新加载到表中?

编辑:我认为使用自动生成的密钥并没有让我的生活更轻松。

自行生成下一个要使用的主键的最佳方法是什么?一个。只是在最后一个条目后增加数字?湾。生成 GUID?C。现有功能?

4

1 回答 1

0

你并没有真正错过任何我认为没有的大概念。您遇到了使用自动生成的密钥可能遇到的固有问题。

在 SQL Server 中(你在使用 SQL Server 吗?)你可以使用一个名为identity insert的功能,它可以关闭(数据库自动编号,适合插入新记录)或开启(你必须提供数字,适合加载从一个文件)。

开/关的含义很容易混淆,因此请阅读文档SET IDENTITY_INSERT

至于如何在您的特定 ORM 的上下文中执行此操作(它是 LINQ to SQL,实体框架?)我不太确定 - 我在实践中对这个问题的回答是解决它(即不要让自己陷入我将自动生成的 ID 存储在一个文本文件中的情况,我需要在我的应用程序逻辑的上下文中重新加载该文件)。

于 2013-01-28T09:15:26.577 回答