如何阻止Linq添加GUID以便SQL Server可以执行此操作?

时间:2012-03-16 17:33:31

标签: .net sql-server linq

我正在以编程方式创建和填充LINQ to SQL对象,然后将它们添加到具有PK的uniqueidentifier列的sql server数据库中。 LINQ自动分配全0的PK。这会在插入时产生错误,因为PK是重复的。

Dim myNewRecord as IceCreamTrackerTable
myNewRecord.name=Bob
myNewRecord.favoriteIceCream=Vanilla
   'myNewRecord.PK=00000000-0000-0000-0000-000000000000 (by default)'
myDataContext.IceCreamTrackerTables.insertOnSubmit(myNewRecord)
    ''second record added throws an error because it also has PK 00000 etc. 
  1. 我知道我可以使用myNewRecord.pk = Guid.newGuid()分配PK Guid is all 0's (zeros)?
  2. 但我真正想要的是SQL服务器分配GUID,因为我假设它有一些方法来确保它不会重新分配相同的guid
  3. 有没有办法告诉LINQ我不想自己填写GUID但是把它留给SQL服务器?

4 个答案:

答案 0 :(得分:3)

您可以注释GUID列以指示它是使用IsDbGenerated生成的数据库:

[Column(Storage="_PK", 
        AutoSync=AutoSync.OnInsert, 
        DbType="UniqueIdentifier NOT NULL", 
        IsPrimaryKey=true, IsDbGenerated=true)]
public Guid PK
{
  //...
}

答案 1 :(得分:3)

Guid是值类型,因此它们不能为null。这意味着当创建Guid时,它必须分配一个默认值(全为0)。 SQL Server不会像为Identity列那样自动生成主键的GUID。您可以将默认值设置为NEWID(),但默认情况下,EF将忽略该值并尝试插入值。您可以通过执行此处描述的操作来覆盖此

http://softmindit.blogspot.com/p/using-guid-as-entitykey-in-entity.html

编辑:我刚刚意识到你正在使用Linq来实现sq而不是Linq。但是,我确信在L2S中有类似的东西可以解决这个问题。

Edit2:linq中有类似的东西,如截图所示。更改此属性可修复问题

enter image description here

答案 2 :(得分:0)

  

我假设它有一些方法来确保它不是   重新分配相同的guid

Guids的全部意义在于它们是独一无二的......或者至少通常是独一无二的。如果它们都是从同一来源分配的,比如在您的服务器上调用Guid.NewGuid(),那么您将不会遇到任何冲突,这是一个非常安全的选择。

答案 3 :(得分:0)

这里的问题是,由于你的PK是一个值类型,它总是有一些值(没有等价的null)。因此,除非生成的类包含特定的功能来跟踪您是否“手动”设置值并省略它,以防您没有,否则无法执行此操作。

因此,查看IceCreamTrackerTable的来源将提供明确的答案。