我正在以编程方式创建和填充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.
有没有办法告诉LINQ我不想自己填写GUID但是把它留给SQL服务器?
答案 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中有类似的东西,如截图所示。更改此属性可修复问题
答案 2 :(得分:0)
我假设它有一些方法来确保它不是 重新分配相同的guid
Guids的全部意义在于它们是独一无二的......或者至少通常是独一无二的。如果它们都是从同一来源分配的,比如在您的服务器上调用Guid.NewGuid()
,那么您将不会遇到任何冲突,这是一个非常安全的选择。
答案 3 :(得分:0)
这里的问题是,由于你的PK是一个值类型,它总是有一些值(没有等价的null
)。因此,除非生成的类包含特定的功能来跟踪您是否“手动”设置值并省略它,以防您没有,否则无法执行此操作。
因此,查看IceCreamTrackerTable
的来源将提供明确的答案。