【问题标题】:Entity Framework database-first approach conditionally insert data实体框架数据库优先方法有条件地插入数据
【发布时间】:2020-06-23 15:06:19
【问题描述】:

使用实体框架,如果数据不存在,如何插入数据,如果存在则更新字段?

public class Rootobject
{
    public string odatacontext { get; set; }
    public Value[] value { get; set; }
}

public class Value
{
    public int AccountId { get; set; }
    public DateTime? SubmissionDate { get; set; }
    public string Status { get; set; }
}

从我使用的 API 中检索所有数据

root.value.Select(x => new satiaL
{ 
    accountID = x.AccountID,
    subDate = x.SubmissionDate,
    x_status = x.Status
});

当然会插入所有记录。

如果AccountID已经存在于数据库中,我想更新x_status的值,但是如果AccountID在数据库中还不存在,那么我想插入所有的值。

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    你不能。

    Upsert 功能不是对象/关系模型的一部分 - 对象存在与否,并通过身份进行跟踪。根本没有“如果不存在就更新”的概念。因此,EfCore 没有什么可以实现的。

    这听起来像是在滥用 ORM 作为 ETL 加载器,这不是您应该做的 - ETL(海量数据加载)不是 ORM 的用途。是时候编写自己的方法将数据向上移动到表中并可能在那里进行向上转换。几年前就这样做了,有时真的很方便。

    现在您所能做的就是为每个帐户运行大量查找并基本上编写代码:如果不存在则创建,如果存在则更新。

    伪代码:

    var account = Find ( select ) or default from db
    if account == null create
    else update
    savechanges
    

    沿着这条线。注意性能 - 您可能只想构建加载所有帐户。当心有冲突的更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多