2009-05-19 7 views
4

Ich möchte mehr oder weniger tun, was diese Frage vorschlägt. How do I MANUALLY set an Identity field in LINQ-To-SQL (IDENTITY INSERT)Linq einfügen auf Primärschlüsselfeld, das ist Autosync

Allerdings möchte ich erklären. Ich habe eine Client-Datenbank. Ich lade Linq-Objekte von hier und die senden sie über WCF. Auf der anderen Seite befestige ich sie an einen Datenkontext und poste sie in der Tabelle. Das Problem ist, dass ihre Guid-Spalte gesetzt wird. Diese Spalte ist in der DBML als AutoSync markiert. Im Falle eines Einsatzes zwingt mich Linq, den neuen Wert zu verwenden. Ich möchte, dass es meinen Wert behält, wenn ich es brauche.

aktualisieren 1

Grundsätzlich möchte ich die AutoSync kippen und IsDbGenerated programmatisch on the fly Einstellung.

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

Wahrscheinlich möchten Sie das IsDbGenerated im laufenden Betrieb anstatt AutoSync ändern. Ich bin mir nicht bewusst, wie ich das von Kopf bis Fuß machen könnte. –

Antwort

0

Sie können Attribute nicht im laufenden Betrieb ändern, ohne die Reflektion zu verwenden. Sie können dies möglicherweise auf andere Weise tun, indem Sie Ihre linq manuell codieren. Ich würde nicht raten, die Attribute im laufenden Betrieb zu ändern, sie sind Attribute von Entwurf, und es könnte unvorhergesehene Konsequenzen geben, um das zu ändern.

1

Lassen Sie mich die Frage umformulieren: Sie wollen die gleichen Objektdefinitionen auf beiden Seiten verwenden, aber auf der einen Seite soll der Bezeichner erzeugt werden, auf der anderen Seite soll er eingefügt werden? Der einzige Weg, um dies zu tun, besteht darin, XML-basierte Metadaten anstelle von attributbasierten Metadaten zu verwenden. Leider, soweit ich weiß, unterstützt der visuelle DBML-Designer keine XML-Metadaten. Sie können jedoch das SqlMetal-Tool verwenden, um das XML zu generieren, und dann die Datei für die Verwendung auf der anderen Seite des Webdiensts ändern.

können Sie beginnen SqlMetal mit hier: http://msdn.microsoft.com/en-us/library/bb386987.aspx

0

Es ist definitiv die IsDbGenerated Eigenschaft, die Sie benötigen, zu betrachten, und nicht AutoSync.

Ich sehe, Sie haben ein Szenario beschrieben, in dem Sie die ID in der Anwendung festlegen möchten. Gibt es tatsächlich ein anderes Szenario, in dem es von der Datenbank automatisch generiert werden muss? Wenn nicht, können Sie einfach IsDbGenerated = false setzen und mit Guid.NewGuid() in Ihrem WCF-Dienst auffüllen, wenn Sie noch keine ID vom Client haben.

Einer der Vorteile der Verwendung eines Rowguids anstelle einer Identitätsspalte besteht darin, dass Sie bestimmte Werte in die Rowguid-Spalte einfügen dürfen, aber das müssen Sie nicht. Sie können die Spalte als Zeilenpfad mit DEFAULT NEWID() beibehalten, aber in Ihrem Dienst IsDbGenerated = false festlegen, und sie funktioniert weiterhin so lange, bis Sie sich daran erinnern, die ID tatsächlich zu füllen.

Verwandte Themen