首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架服务器端计算值

实体框架服务器端计算值
EN

Stack Overflow用户
提问于 2016-06-05 15:28:33
回答 2查看 196关注 0票数 2

我正在使用一个api,它有下面的类供时间使用。

代码语言:javascript
复制
public class CRTime
{
    public DateTime? datetime { get; set; }
    public string timezone { get; set; }
}

我想把它转换成一个DateTime字段。

下面是一个返回给我的完整对象的示例,以及我如何尝试计算DateTime字段,然后将其存储在数据库中。

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-08 21:26:31

这是因为AddOrUpdate的一个相当令人困惑的怪癖。

显然,AddOrUpdate确定一个实体是新的还是现有的。它通过通过主键或您可以指定的某个键查询数据库中的实体来做到这一点。现在有两件事可以发生:

  • 它在数据库中找不到实体;实体对象被标记为Added
  • 它确实找到了一个实体,但与您所期望的相反,实体对象仍然是Detached!找到的实体仍然是隐藏的,这是对象EF最后更新的内容。它将值从您自己的实体复制到它,这可能将隐藏的实体标记为Modified

显然,通过这个空的setter,当从数据库中获取CreatedDB时,它总是null。对于EF来说,CRCreated并不存在。它可能从对象中读取CreatedDB值,但是空的setter再次阻止将其复制到隐藏的对象中,并将其更新为null

你得决定怎么解决这个问题。最好的方法可能是让setter实际修改(或创建) CRCreated实例。

或者,您可以取消AddOrUpdate并尝试自己找到现有的对象。如果你找到它,它就不再隐藏了,所以你可以随心所欲地使用它。

票数 2
EN

Stack Overflow用户

发布于 2016-06-05 17:19:08

在您从Db中读取它之后,我希望它是空的。当然,private set;很奇怪,阻碍了EF的正常工作。

当你能够使用DateTimeOffset时,你可以帮你自己一个大忙,但在目前的情况下:

您的属性可能在逻辑上是“计算”的,但是对于数据库,应该将其作为一个正常的读/写属性来处理和实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37643563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档