我正在使用一个api,它有下面的类供时间使用。
public class CRTime
{
public DateTime? datetime { get; set; }
public string timezone { get; set; }
}我想把它转换成一个DateTime字段。
下面是一个返回给我的完整对象的示例,以及我如何尝试计算DateTime字段,然后将其存储在数据库中。
public class ReturnObject
{
[NotMapped]
// This comes from the api, but is not synced to database
public CRTime CRCreated { get; set; }
// this is stored in our db, should be calculated from CRCreated
public DateTime? CreatedDB { get
{
var val = (CRCreated != null) ? CRCreated.datetime : null;
return val;
}
private set { }
}
// other fields go here
}这在记录创建上非常有效,但是当我尝试使用Entity.Migration框架和AddOrUpdate更新记录时,更新会覆盖该值,并始终将其设置为NULL。
创建服务器端计算列的最佳解决方案是什么,然后将其同步到数据库。
边注:我使用NewtonSoft Json将对象反序列化为实体框架对象,然后将其传递给实体框架AddOrUpdate。
发布于 2016-06-08 21:26:31
这是因为AddOrUpdate的一个相当令人困惑的怪癖。
显然,AddOrUpdate确定一个实体是新的还是现有的。它通过通过主键或您可以指定的某个键查询数据库中的实体来做到这一点。现在有两件事可以发生:
Added。Detached!找到的实体仍然是隐藏的,这是对象EF最后更新的内容。它将值从您自己的实体复制到它,这可能将隐藏的实体标记为Modified。显然,通过这个空的setter,当从数据库中获取CreatedDB时,它总是null。对于EF来说,CRCreated并不存在。它可能从对象中读取CreatedDB值,但是空的setter再次阻止将其复制到隐藏的对象中,并将其更新为null。
你得决定怎么解决这个问题。最好的方法可能是让setter实际修改(或创建) CRCreated实例。
或者,您可以取消AddOrUpdate并尝试自己找到现有的对象。如果你找到它,它就不再隐藏了,所以你可以随心所欲地使用它。
发布于 2016-06-05 17:19:08
在您从Db中读取它之后,我希望它是空的。当然,private set;很奇怪,阻碍了EF的正常工作。
当你能够使用DateTimeOffset时,你可以帮你自己一个大忙,但在目前的情况下:
您的属性可能在逻辑上是“计算”的,但是对于数据库,应该将其作为一个正常的读/写属性来处理和实现。
https://stackoverflow.com/questions/37643563
复制相似问题