ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

CodeGo.net>如何在SQL Server CE和实体框架中使用默认的DateTime值

2019-12-01 11:16:35  阅读:187  来源: 互联网

标签:sql-server-ce c entity-framework sql-server


为了简单起见,假设我有一个称为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 db = new Database();
db.Widgets.AddObject(new Widget { Id = 2 });
db.SaveChanges();

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

那么,如何使上面的C#示例起作用?我不希望更改数据库架构.而且我知道我可以在Widget构造函数中将Created属性设置为DateTime.Now,但是从构造Widget到将其实际插入数据库可能要花费几分钟,这就是我要捕获的实际时间.

更新:我尝试将StoreGeneratedPattern设置为Identity and Computed,但是它引发了一个例外: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);
  }
}

所有Widget的Created值都将设置为当前日期和时间.我看到的唯一其他问题是,该值是根据客户端的时钟而不是服务器的时钟设置的.而且,如果您一次插入许多行,则时间戳将比普通插入时提前一些.

最好的解决方案将允许SQL Server执行其配置要执行的操作-如果未提供,请设置列的值.这就是生活.

标签:sql-server-ce,c,entity-framework,sql-server
来源: https://codeday.me/bug/20191201/2080568.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有