LinqのDateTimeフィールドにヌル値を渡します
-
13-10-2019 - |
質問
私のデータベーステーブルはこのようなものです
CREATE TABLE MYBUDGET.tbl_CurrentProperty
(
[PropID] INT NOT NULL IDENTITY(1,1),
[UpdatedOn] DATETIME NOT NULL,
[Amount] MONEY NOT NULL,
[Remarks] VARCHAR(100) NOT NULL,
)
ALTER TABLE MYBUDGET.tbl_CurrentProperty ADD CONSTRAINT PK_CurrentProperty_PropID PRIMARY KEY ([PropID])
ALTER TABLE MYBUDGET.tbl_CurrentProperty ADD CONSTRAINT DF_CurrentProperty_UpdatedOn DEFAULT (DATEADD(MINUTE,30,DATEADD(HOUR, 5, GETUTCDATE()))) FOR [UpdatedOn]
ALTER TABLE MYBUDGET.tbl_CurrentProperty ADD CONSTRAINT CK_CurrentProperty_Amount CHECK([Amount] > -1)
GO
LinqをSQLに使用しています。 C#では、[金額]および[備考]フィールドとその他のフィールドのみを渡す必要があります。
c#では、以下のようにtbl_currentpropertiesオブジェクトを作成します。
tbl_CurrentProperties currentProperties = new tbl_CurrentProperties();
currentProperties.Amount = 50.00M;
currentProperties.Remarks = "remarks";
次に、データコンテキストにオブジェクトを送信します。しかし、ここでは、linqが割り当てられました '1/1/0001 12:00:00 AM'
updatedonフィールド用。しかし、これはSQL DateTime範囲に違反します 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM
例外を発生します。また、null値を手動で割り当てることはできません DateTime
ヌル可能なタイプではないため、フィールド。とにかく、デフォルトの制約を使用するためにこれを作成する必要があります。どうすればいいですか?
PS:私のデータベースはオンラインで、ユーザーはさまざまな場所にいるので、このように使用したいと思います。したがって、DateTime.Nowを使用した場合、ユーザーマシンの時間が間違っている可能性があり、DBに間違った値を挿入します。常にSQLサーバー時間を使用する必要があります。
解決
アンドレイ 答え 部分的に正しいです。私はこれをテストしたばかりで、ここに私が見つけたものがあります。
あなたのDBMLデザイナーで、あなたの UpdatedOn
列を設定します。
Auto Generated Value = True
Nullable = False
次に、 INSERT
使用する場合 SQL Server Profiler 生成されたSQLを見るには、 UpdatedOn
は インサートには含まれていません. 。ヌル値すらありません。これは重要です:SQL Serverがそのcolumのデフォルト値を使用するために、列 省略する必要があります から INSERT
. 。設定した場合 Nullable = True
に UpdatedOn
, 、linqからsql そうかもしれない に列を含めます INSERT
ヌル値で。
参考までに、その直後 INSERT
aが必要です SELECT
LINQからSQLが自動生成値を取得している場合、エンティティオブジェクトには最新の値があります。
他のヒント
DBMLを開き、自動生成されたフィールドに「自動生成値」= trueをオンにします。あなたはすべてヌルを渡すのに良いはずです
私はあなたがあなたを開くことをお勧めします DBML
ファイルを使用します XML Editor
その列のタイプをから変更します DateTime
に DateTime?
ヌルを許可することによって。保存すると、コードが生成されます。
いつでも LINQ to SQL
間違った生成 DBML
, 、自分で編集する方が良いです。