gpt4 book ai didi

c# - 如何将默认日期时间值与 SQL Server CE 和 Entity Framework 一起使用

转载 作者:行者123 更新时间:2023-11-30 16:24:58 27 4
gpt4 key购买 nike

为简单起见,假设我有一个名为 Widgets 的 SQL Server CE 表:

create table [Widgets] (
[Id] int not null primary key,
[Created] datetime not null default getdate())

在不为 Created 列指定值的情况下插入按预期工作:

insert into [Widgets] ([Id]) values (1)

生成名为 Database 的 Entity Framework 模型后,我编写了以下代码:

Database db = new Database();
db.Widgets.AddObject(new Widget { Id = 2 });
db.SaveChanges();

但它引发了一个异常:在转换为日期时间时发生溢出。我追踪到这个事实是 EF 将 Created 列视为不可为 null 的 DateTime,因此当构造新的 Widget 时,其 Created 属性设置为默认的 DateTime(0001- 01-01 12:00:00),这超出了 SQL Server CE 的有效范围。

那么,如何让上面的 C# 示例工作?我不想更改数据库架构。我知道我可以在 Widget 构造函数中将 Created 属性设置为 DateTime.Now,但从时间开始可能需要几分钟Widget 构建直到它实际插入数据库,这是我想要捕获的实际时间。

更新:我尝试将 StoreGeneratedPattern 设置为 IdentityComputed,但它引发了一个异常:SQL Server Compact 不支持服务器生成的键和服务器生成的值。默认值在 SQL Server CE 中确实有效,因此它一定是 Entity Framework 的限制。 (显然这在 SQL Server CE 4.0 中已修复。)

最佳答案

看起来 DanM 的相关问题链接为我指明了更改跟踪的正确方向。以下代码将非常接近我正在寻找的行为:

public partial class Database
{
public override int SaveChanges(SaveOptions options)
{
foreach(var w in this.ObjectStateManager
.GetObjectStateEntries(EntityState.Added)
.Where(e => e.Entity is Widget)
.Select(e => (Widget)e.Entity))
{
if(w.Created == default(DateTime))
w.Created = DateTime.Now;
}

return base.SaveChanges(options);
}
}

所有 WidgetCreated 值都将设置为当前日期和时间。我看到的唯一其他问题是该值是根据客户端的时钟设置的,而不是服务器的。如果您一次插入多行,时间戳将比正常插入时的时间戳稍早。

最好的解决方案是允许 SQL Server 执行其配置的操作——如果未提供,则设置列的值。 C'est la vie.

关于c# - 如何将默认日期时间值与 SQL Server CE 和 Entity Framework 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10342636/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com