Linq插入自动同步的主键字段

时间:2009-05-19 20:39:57

标签: c# sql-server linq guid

我或多或少想要做这个问题的建议。 How do I MANUALLY set an Identity field in LINQ-To-SQL (IDENTITY INSERT)

但是,我想解释一下。我有一个客户端数据库。我从这里加载Linq对象并将它们发送到WCF。另一方面,我将它们附加到数据上下文并将它们发布到表中。问题是,他们将设置Guid列。此列在DBML中标记为AutoSync。因此,在插入的情况下,Linq强迫我使用新值。我希望它能在我需要的时候保持我的价值。

更新1

基本上我想以编程方式快速翻转AutoSync和IsDbGenerated设置。

[Column(Storage="_cName", 
        AutoSync=AutoSync.OnInsert, 
        DbType="UniqueIdentifier NOT NULL", 
        IsPrimaryKey=true, IsDbGenerated=true)]

3 个答案:

答案 0 :(得分:1)

让我重新解释一下这个问题:你想在两边使用相同的对象定义,但一方面你想要生成标识符,而另一方面你想要插入它?我知道这样做的唯一方法是使用基于XML的元数据而不是基于属性。不幸的是,据我所知,visual DBML设计器不支持XML元数据。但是,您可以使用SqlMetal工具生成XML,然后修改该文件以便在Web服务的另一端使用。

您可以在此处开始使用SqlMetal:http://msdn.microsoft.com/en-us/library/bb386987.aspx

答案 1 :(得分:0)

如果不使用反射,则无法动态更改属性。您可以通过手动编码您的linq以另一种方式执行此操作。我不建议动态更改属性,它们是设计属性,并且可能存在无法预料的改变它的意图。

答案 2 :(得分:0)

绝对是您需要查看的IsDbGenerated属性,而不是AutoSync。

我看到你已经描述了一个你想在应用程序中设置ID的场景。实际上还有另一种情况需要由数据库自动生成吗?如果没有,您可以设置IsDbGenerated = false,并在您的WCF服务中填充Guid.NewGuid(),如果/当您还没有来自客户端的ID时。

使用rowguid而不是标识列的一个优点是,您可以将特定值插入rowguid列,但您不必这样做。您可以使用DEFAULT NEWID()将列保留为rowguid,但在服务中设置IsDbGenerated = false,只要您记得实际填充ID,它仍然有效。