私のテーブルの1つに時間を書き込むためにSQL Server上で時計を使う必要があるので、私はちょうどGETDATE()を使うと思っていました。問題は、INSTEAD OFトリガーのためにエラーが発生していることです。別の列がID列の場合、ある列をGETDATE()に設定する方法はありますか?INSTEAD OFトリガーとアイデンティティ列を持つLinq to SQL
これは、LINQのツーSQLです:
internal void LogProcessPoint(WorkflowCreated workflowCreated, int processCode)
{
ProcessLoggingRecord processLoggingRecord = new ProcessLoggingRecord()
{
ProcessCode = processCode,
SubId = workflowCreated.SubId,
EventTime = DateTime.Now // I don't care what this is. SQL Server will use GETDATE() instead.
};
this.Database.Add<ProcessLoggingRecord>(processLoggingRecord);
}
は、これはテーブルです。 EventTimeは私がGETDATE()として持っていたいものです。私は列をnullにしたくありません。
そして、ここでトリガーです:
ALTER TRIGGER [Master].[ProcessLoggingEventTimeTrigger]
ON [Master].[ProcessLogging]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
SET IDENTITY_INSERT [Master].[ProcessLogging] ON;
INSERT INTO ProcessLogging (ProcessLoggingId, ProcessCode, SubId, EventTime, LastModifiedUser)
SELECT ProcessLoggingId, ProcessCode, SubId, GETDATE(), LastModifiedUser FROM inserted
SET IDENTITY_INSERT [Master].[ProcessLogging] OFF;
END
私が試したのバリエーションのすべてに得ることなく、この最後の試みは、このエラーを生成します。
InvalidOperationExceptionが メンバーオートシンクの失敗。挿入後に自動同期されるメンバーの場合、タイプには自動生成のIDまたは挿入後にデータベースによって変更されないキーが必要です。
エンティティからEventTimeを削除することはできますが、そのようにしたくありません。それがなくなってしまった場合は、INSERT中にNULLになり、GETDATE()が使用されます。
私は単にINSERTのEventTime列でGETDATE()を使用できますか?
注:私は二つの理由からC#のDateTime.Nowを使用したくない: 2.タイムズがマシンごとに異なることができます(別のストアドプロシージャから)これらのインサートの 1つSQL Server自体によって生成され、私のプロセスがどのくらい速く起こっているかを正確に知りたいのです。
これは完璧に機能しました!ありがとう! –