为简单起见,假设我有一个名为的 SQL Server CE 表Widgets:
create table [Widgets] (
[Id] int not null primary key,
[Created] datetime not null default getdate())
在不指定Created列值的情况下插入按预期工作:
insert into [Widgets] ([Id]) values (1)
生成名为 的实体框架模型后Database,我编写以下代码:
Database db = new Database();
db.Widgets.AddObject(new Widget { Id = 2 });
db.SaveChanges();
但它引发了一个例外:An overflow occurred while converting to datetime.我将此归结为 EF 将该Created列视为 non-nullable的事实,DateTime因此当Widget构造一个新列时,它的Created属性设置为默认值DateTime(0001-01-01 12:00:00 ),这超出了 SQL Server CE 的有效范围。
那么,如何让上述 C# 示例工作?我不想更改数据库架构。而且我知道我可以在构造函数中将Created属性设置为,但是从构造 a 到它实际插入数据库可能需要几分钟,这是我想要捕获的实际时间。DateTime.NowWidgetWidget
更新:我尝试设置StoreGeneratedPattern为Identityand Computed,但它引发了一个异常:Server-generated keys and server-generated values are not supported by SQL Server Compact. 默认值在 SQL Server CE 中确实有效,因此它必须是实体框架的限制。(显然这在 SQL Server CE 4.0 中已修复。)