4

对或错,我使用唯一标识符作为我的 sqlserver 数据库中表的主键。我已经使用 linq to sql (c#) 生成了一个模型,但是在列 linq to sql 的情况下,在为/的默认值identity插入新记录时生成唯一键。guiduniqueidentifier00000000-0000-0000-0000-000000000000

我知道我可以在我的代码中设置 guid:在 linq to sql 模型或其他地方,或者在创建 sql server 表时有默认值(尽管这被代码中生成的值覆盖)。但是最好在哪里生成这个密钥,注意我的表总是会随着我的解决方案的发展而改变,因此当它发生时我将重新生成我的 Linq to Sql 模型。

相同的解决方案是否适用于保存当前datetime(插入的)的列,每次更新都会更新?

4

3 回答 3

4

正如您在自己的帖子中所指出的,您可以使用可扩展性方法。添加到您的帖子中,您可以查看在数据上下文中创建的用于插入和更新每个表的部分方法。一个名为“test”的表和一个“changeDate”列的示例:

partial void InsertTest(Test instance)
{
    instance.idCol = System.Guid.NewGuid();
    this.ExecuteDynamicInsert(instance);
}

partial void UpdateTest(Test instance)
{
    instance.changeDate = DateTime.Now;
    this.ExecuteDynamicUpdate(instance);
}
于 2009-05-29T10:00:47.330 回答
1

谢谢,我已经尝试过了,它似乎工作正常。我有另一种方法,我想我将用于 guid:sqlserver 默认值为 newid(),然后在 linqtosql 中将自动生成的值属性设置为 true。这必须在每一代模型上完成,但这相当简单。

于 2011-06-10T07:36:34.720 回答
0

你可以做两件事:

  • 要么只在 C# 客户端代码中生成 GUID 并使用该值
  • 在 SQL Server 中的 GUID 列上创建默认为该列的 DEFAULT 约束newid()- SQL Server 将确保始终添加默认值 - 除非您自己指定一个值

至于自更新日期/时间列 - 在这里您可能必须使用客户端逻辑来执行此操作,或者如果您想在 SQL Server 上执行此操作,则必须编写一个触发器。这实际上是每次更新行时更新特定列的唯一方法 - 没有“自动更新”约束或类似的东西(默认约束仅适用于 INSERT,不适用于更新)。

像这样的东西可能会起作用:

CREATE TRIGGER TRG_UpdateDateTimestamp
ON (your table name)
AFTER UPDATE 
AS
    IF NOT UPDATE(DateTimeStamp)
    BEGIN
       UPDATE (yourtablename) 
       SET DateTimeStamp = GETDATE()
       WHERE EXISTS (SELECT * FROM inserted AS i 
                     WHERE i.OID = (yourtable).OID)
   END

马克

于 2009-05-29T08:59:40.950 回答