Linq to Sql での SqlServer uniqueidentifier/更新日列の使用 - ベスト アプローチ
-
06-09-2019 - |
質問
正しいか間違っているかにかかわらず、私は sqlserver データベース内のテーブルの主キーとして一意の識別子を使用しています。linq to sql (c#) を使用してモデルを生成しましたが、 identity
列 linq to sql は、新しいレコードを挿入するときに一意のキーを生成します。 guid
/uniqueidentifier
のデフォルト値 00000000-0000-0000-0000-000000000000
.
コードで guid を設定できることはわかっています。linq to SQL モデルまたはその他の場所で、または SQL サーバー テーブルの作成時にデフォルト値が存在します (ただし、これはコード内で生成された値によって上書きされます)。ただし、このキーを生成する場所はどこに置くのが最適ですか。ソリューションの開発に応じてテーブルは常に変更されるため、変更があった場合には Linq to SQL モデルを再生成することに注意してください。
現在を保持する列にも同じ解決策が適用されますか? datetime
(挿入物の)更新のたびにどれが更新されますか?
解決
あなたは拡張メソッドを使用することができます。あなたのポストに追加あなたが挿入し、各テーブルの更新のための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);
}
他のヒント
おかげで、私はこのアウトを試みたし、OKに動作するようです。 SQLServerのデフォルト値を(NEWIDする)、その後、linqtosqlでtrueに自動生成された値のプロパティを設定します。私は私がGUIDの使用しなければならないと思います別のアプローチは、持っています。これは、モデルの各世代に行う必要がありますが、これは非常に簡単です。
できることは 2 つあります。
- 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
マルク