簡単にするために、次のようなSQLServerCEテーブルがあるとしますWidgets。
create table [Widgets] (
[Id] int not null primary key,
[Created] datetime not null default getdate())
Created列の値を指定せずに挿入すると、期待どおりに機能します。
insert into [Widgets] ([Id]) values (1)
と呼ばれるEntityFrameworkモデルを生成した後、Database次のコードを記述します。
Database db = new Database();
db.Widgets.AddObject(new Widget { Id = 2 });
db.SaveChanges();
しかし、それは例外を引き起こします: EFが列をnull許容ではないとAn overflow occurred while converting to datetime.見なすという事実までこれを追跡したので、newが構築されると、そのプロパティはデフォルト(0001-01-01 12:00:00 )に設定されます)、これはSQLServerCEの有効範囲外です。CreatedDateTimeWidgetCreatedDateTime
では、上記のC#のサンプルを機能させるにはどうすればよいですか?データベーススキーマを変更したくない。CreatedコンストラクターでプロパティをDateTime.Nowに設定できることはわかっていますWidgetが、aが作成されてから実際にデータベースに挿入されるまで、数分かかる場合がWidgetあります。これは、実際にキャプチャしたい時間です。
更新:とに設定しようとしStoreGeneratedPatternましIdentityたComputedが、例外が発生します:Server-generated keys and server-generated values are not supported by SQL Server Compact。デフォルト値はSQLServerCEで機能するため、EntityFrameworkの制限である必要があります。(どうやらこれはSQL Server CE 4.0で修正されています。)