【问题标题】:EF Core Set FK to NULL for child entity with soft delete parent entity recordEF Core 将具有软删除父实体记录的子实体的 FK 设置为 NULL
【发布时间】:2022-01-20 22:52:27
【问题描述】:

在为客户(父实体)设置 Isdeleted = true(软删除)时,我试图将订单的 CustomerID 设置为 NULL。

它正在更新“archivedBy”和“ArchivDate”, 但不会将 CustomerID 更新为 NULL。

除了单独获取订单并将 CustomerID 设置为 NULL 之外,还有其他选择吗?

下面是我用来更新数据的代码。

var customer = dbContext.Customers.Find(1);

customer.IsDeleted = true;
customer.Orders.ForEach(r =>
   r.CustomerId = NULL;
   r.ArchivedBy = user;
   r.ArchivedDate = DateTime.Today()
);

dbContext.Customers.Update(customer);
dbContext.SaveChanges();

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    您不需要调用更新客户,它会破坏代码 并且不要使用 Find,您必须将 Orders 包含到您的数据库集中。并且最好使用 For 循环,它不会创建副本

    var customerId=1;
    var customer = dbContext.Customers.
             .Include(i=>i.Orders).First( c=> c.Id == customerId );
    
    customer.IsDeleted = true;
    for(var i==0; i< customer.Orders.Count; i++)
    {
       customer.Orders[i].CustomerId = null;
       customer.Orders[i].ArchivedBy = user;
       customer.Orders[i].ArchivedDate = DateTime.Today()
    );
    
    dbContext.Entry(customer).State = EntityState.Modified; //optional
    
    dbContext.SaveChanges();
    

    如果仍然无法正常工作,请尝试修改 Orders,而不是 customer.Orders。

    var customerOrders= dbContext.Orders.Where(o=> o.CustomerId==customerId).ToList();
    
    for(var i==0; i< customerOrders.Count; i++)
    {
       customerOrders[i].CustomerId = null;
       customerOrders[i].ArchivedBy = user;
       customerOrders[i].ArchivedDate = DateTime.Today()
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2021-02-16
      • 2020-05-31
      • 2021-12-20
      相关资源
      最近更新 更多