在C#Linq表中保留唯一主键

时间:2013-01-28 09:04:12

标签: c# database linq

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

我有一个类似下面的“人”类,我已经定义了一个名为Id的列,它是主键 - 即它必须是唯一的。

我还指定isDbGenerated = true,这样我就不必手动指定此ID。

[Table]
public class Person
{

    [Column(IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id;

    ...
}

当我向表中添加行时,这很有用。

当我从表中删除行时,它会在行ID序列中留下空白。这很好。

当我尝试保存数据并将其重新加载到表中时,会出现问题。为了保存数据,我手动将所需信息写入文本文件。

当我将数据重新加载到我的表中时,自动生成的ID会覆盖我保存信息的原始ID。这会导致我的大型数据库出现问题,这些数据库通过ID引用这些行。

例如。

我的数据库包含以下行:

  • ID,姓名
  • 1,John
  • 2,Jim
  • 4,Mark(注意#3丢失,因为我在某个时候删除了它)
  • 5,David

我将这些保存到文本文件中。我在另一个时间从文本文件中将它们加载回一个空表。

  • 1,John
  • 2,Jim
  • 3,马克
  • 4,大卫

IsDBGenerated功能导致这些数字是连续的。

我最好的方法是设置它,以便在保留唯一ID的同时将数据重新加载到表中?

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

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

1 个答案:

答案 0 :(得分:0)

你并没有真正错过任何我无法想到的重要概念。您可以遇到自动生成密钥可能遇到的固有问题。

在SQL Server中(您使用的是SQL Server吗?),您可以使用名为标识插入的功能,该功能可以关闭(数据库自动编号适用于您,适用于插入新记录)或 on (您必须提供数字,适合从文件加载)。

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

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