gpt4 book ai didi

c# - Entity Framework 服务器端计算值

转载 作者:行者123 更新时间:2023-11-30 21:48:26 26 4
gpt4 key购买 nike

我正在使用具有以下时间类的 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 将对象反序列化为我的 Entity Framework 对象,然后将其传递给 Entity Framework AddOrUpdate。

最佳答案

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

显然,

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

  • 它没有在数据库中找到实体;您的实体对象被标记为已添加
  • 它确实找到了一个实体,但与您的预期相反,您的实体对象仍然是 Detached!找到的实体保持隐藏状态,这是 EF 最后更新的对象。它将值从您自己的实体复制到它,这可能会将隐藏的实体标记为 Modified

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

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

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

关于c# - Entity Framework 服务器端计算值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37643563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com