我或多或少想要做这个问题的建议。 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)]
答案 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,它仍然有效。