生成客户端上的日期时间字符串,如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)
答案 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年以后得到支持