4

正しいか間違っているかを問わず、SQLServerデータベースのテーブルの主キーとして一意の識別子を使用しています。linq to sql(c#)を使用してモデルを生成しましたが、列の場合、 linq to sqlは、デフォルト値の/のidentity新しいレコードを挿入するときに一意のキーを生成します。guiduniqueidentifier00000000-0000-0000-0000-000000000000

私は自分のコードでGUIDを設定できることを知っています:linqからsqlモデルまたは他の場所で、またはsqlサーバーテーブルの作成にデフォルト値があります(ただし、これはコードで生成された値によってオーバーライドされます)。ただし、このキーを生成するのに最適な場所は、ソリューションの開発に伴ってテーブルが常に変更されるため、LinqtoSqlモデルが変更されたときに再生成することに注意してください。

同じ解決策が、(挿入の)電流を保持する列に適用されます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

できることは2つあります。

  • C#クライアント側コードでGUIDを生成し、その値を使用するだけです
  • SQL ServerのGUID列にDEFAULT制約を作成します。この制約は、デフォルトで列に設定さnewid()れます。SQLServerは、自分で値を指定しない限り、常にデフォルトを追加するようにします。

自己更新の日付/時刻列については、おそらくクライアント側のロジックを使用して実行する必要があります。SQLServerで実行する場合は、トリガーを作成する必要があります。これは、行が更新されるたびに特定の列を更新する唯一の方法です。「autoupdate」制約などはありません(デフォルトの制約は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 に答える