EF:在SaveChanges()上将DateTimeOffset值更改为Utc

时间:2016-09-09 05:19:02

标签: c# angularjs sql-server entity-framework asp.net-web-api

生成客户端上的日期时间字符串,如moment().format() => 2016-09-09T01:29:25+05:30

在HTTP上发布到服务器,在调试时我仍然可以看到正确的偏移量。但是,在调用saveChanges()之后,在数据库中,该值将存储为utc,其中+00:00为偏移量(例如:2016-09-08 00:30:00.0000000 +00:00)。

如何保持偏移值不变?

代码:

EF表实体模型:

public partial class SomeTable
    {
        public long Id { get; set; }
        public Nullable<System.DateTimeOffset> StartTime { get; set; }
        public Nullable<System.DateTimeOffset> EndTime { get; set; }
    }

Post Model:
    public class DateInfoModel
    {
        public long Id { get; set; }
        public DateTimeOffset StartTime { get; set; }
        public DateTimeOffset EndTime { get; set; }
    }

行动方法:

[HttpPost]
[Route("UpdateInfo")]
public IHttpActionResult UpdateInfo(DateInfoModel model) {
    Int64 user_id = User.Identity.GetUserId<Int64>();
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
    SomeTable new_rec = new SomeTable();
    new_rec.StartTime = model.StartTime;
    new_rec.EndTime = model.EndTime;
    db.SomeTable.Add(new_rec);
    db.SaveChanges();
    return Ok();
}

客户端:

updateDateInfo = (): ng.IPromise<any> => {
        var to_send;
        to_send.StartTime = moment().format();
        to_send.EndTime = moment().format();
        return this.$http.post(webApiBaseUrl + "api/UpdateDateInfo",
            to_send)
            .then((response) => {
                if (response.status == 200) {
                    return response;
                }
                else {
                    return this.$q.reject(response);
                }
            }, (response) => {
                return this.$q.reject(response);
            })
    }

注意: SQL列类型也设置为datetimeoffset(7)

1 个答案:

答案 0 :(得分:0)

实体框架对Nullable&lt;&gt;做出奇怪的反应类型声明。除非您在DbContext中指定其行为,否则它不会生成可为空的字段,例如:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<MyEntity>().Property(x => x.MyNullableInt).IsOptional();
}

另一方面,如果您只是简单地声明您的模型:

public partial class SomeTable
{
    public long Id { get; set; }
    public DateTimeOffset? StartTime { get; set; }
    public System.DateTimeOffset? EndTime { get; set; }
}

实体框架现在将在相应的数据库表中将该字段创建为可为空。

我怀疑这会解决你的问题,但我认为值得注意。现在关于您的问题,请尝试在实体配置中指定该DateTimeOffset的精度,如下所示:

public class SomeTableConfig : EntityTypeConfiguration<SomeTable>
{
    public SomeTableConfig()
    {
        this.Property(a => a.StartTime).HasColumnType("datetimeoffset").HasPrecision(0);
        this.Property(a => a.EndTime ).HasColumnType("datetimeoffset").HasPrecision(0);
    }
}

确保运行迁移并检查数据库是否反映了正确的结构。检查数据库中该列的数据类型是否为DateTimeOffset()而不是DateTime()。

除此之外,我没有看到为什么它不能维护你的TimeZone的任何理由。您使用的是哪个版本的SQL Server?我认为DateTimeOffset仅在2008年以后得到支持