2009-05-29 11 views
4

私のsqlserverデータベースのテーブルのプライマリ・キーとしてユニークな識別子を使用しています。私はlinqからsql(C#)を使用してモデルを生成しましたが、identity列の場合linq to sqlは​​/のデフォルト値00000000-0000-0000-0000-000000000000の新しいレコードを挿入する際に一意のキーを生成します。SqlServerのuniqueidentifier/updatedカラムをLinqからSqlへ - ベスト・アプローチ

linqからSQLモデルなどのコードでguidを設定できることがわかっています。または、SQL Serverテーブルを作成する際にデフォルト値があります(これはコードで生成された値によってオーバーライドされます) 。しかし、どこに私のテーブルが常に私のソリューションが開発するように変更されることに注意して、このキーを生成するために最適なので、私は私のLinq SQLモデルを再生成します。

現在のdatetime(挿入物)を保持する列にも同じ解決策が適用されますが、これは各更新で更新されますか?

答えて

4

あなたはあなたの中にあなたが拡張メソッドを使用することができます自分のポストを指摘したように。あなたの投稿に追加すると、各テーブルの挿入と更新のためにdatacontextで作成された部分的なメソッドを見ることができます。 「テスト」と呼ばれるテーブルと「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); 
} 
+0

ステファンありがとう、私はこれがおそらく私の好みのアプローチ、UpdateTest(...)はうまく見えますが、OnCreatedを使用してInsertTestを使用する際の懸念事項は、他の関連オブジェクトと関連して発生する可能性のあるオブジェクトライフサイクルの場所です。私はGUIDをまだ生成していないデフォルトの0を使って、他のオブジェクトへのリンクを作成することができますか? – Richbits

+0

AFAIK関連オブジェクトが親オブジェクトにエンティティセットとして添付されている場合、関連オブジェクトの外部キーが挿入後に更新されます。しかし、私は、OnCreateメソッドでguidを設定することに何も問題がないことを発見しました。私はInsert-Methodを使用します。これは、データベース内の数値プールから取得された固有の連続番号(たとえば請求書番号)を設定する必要があるためです。固有のキーの場合は、ID列を使用します。 –

+0

ありがとう、私はこれを試してみて、それは問題なく動作するようです。元のOnCreated()メソッドを使用しましたが、このアプローチに変更されました。 – Richbits

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 

マルク・

+0

ありがとうMarc、sql生成コードに対するデフォルトのlinqの問題は、0s guidを生成するということです。sqlserverによって作成されたデフォルトは上書きされます(私はこれに対する解決策を見つけたと思います。自分自身に答える)。トリガーは便利ですが、私はそれを試してみますが、私はすべてのテーブルにこのコードを書く必要を避けるために、より汎用的な解決策が必要だと感じています。おそらく、私はtname、idとdatetimeのcolsを持つ一般的なUpdatesテーブルを持っていて、そのテーブルに新しいレコードを挿入するためにジェネリックのストアドプロシージャを実行するために各テーブルにトリガを持っていますか?それは実行可能ですか? – Richbits

+1

何らかの理由で私の答えがここに見つかりませんでした:http://codecadet.strongerforyou.com/post/Linq-to-SQL-using-Uni​​que-Identifiers.aspx – Richbits

1

おかげで、私はこれを試してみたのだが、OKに動作するようです。 私はguidのために使うと思う別のアプローチがあります:sqlserverのデフォルト値をnewid()に、次にlinqtosqlでauto生成されたvalueプロパティをtrueに設定します。これはモデルの世代ごとに行う必要がありますが、これはかなり簡単です。

関連する問題