为简单起见,假设我有一个名为的 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.Now
Widget
Widget
更新:我尝试设置StoreGeneratedPattern
为Identity
and Computed
,但它引发了一个异常:Server-generated keys and server-generated values are not supported by SQL Server Compact
. 默认值在 SQL Server CE 中确实有效,因此它必须是实体框架的限制。(显然这在 SQL Server CE 4.0 中已修复。)