EF Core 为 dbContext 传递 TEntity 以执行更新或添加

Posted

技术标签:

【中文标题】EF Core 为 dbContext 传递 TEntity 以执行更新或添加【英文标题】:EF Core pass TEntity for dbContext to do Update or Add 【发布时间】:2021-08-06 10:17:11 【问题描述】:

使用 EF Core,我有 10 种方法基本上做同样的事情。更新或添加,然后 SaveChanges()

  public void UpdateUser(User model)
    
        if(... some condition.. to determine to add or update)
        
            db.Update(model);
            db.Entry(model).State = EntityState.Modified;
        
        else
                
           db.User.Add(model);
         
        db.SaveChanges(); 
    

  public void UpdateCompany(Company model)
       
        if(... some condition.. to determine to add or update)
        
            db.Update(model);
            db.Entry(model).State = EntityState.Modified;
        
        else
                
           db.Company.Add(model);
         
        db.SaveChanges(); 
    

是否可以创建一种方法并只传递要更新或添加的实体?

【问题讨论】:

【参考方案1】:

您可以使用通用方法。如果您需要访问实体的 DbSet,请使用 db.Set<TEntity>() 而不是声明的 DbSet 属性 db.Usersdb.Comanies

    public void Update<TEntity>(TEntity entity) where TEntity: class
    

        if (1==1 /*whatever*/)
        
            db.Update(entity);
        
        else
        
            db.Set<TEntity>().Add(entity);
        
        db.SaveChanges();
    

【讨论】:

【参考方案2】:

UpdateAdd 之间的真正区别是 PrimaryKey 值。当您尝试 Update 包含 null PrimaryKey 的数据时,它不会更新数据,它会添加该数据。你可以控制model 来了解它是否更新。如果PrimaryKey 为空,它可以添加该数据。如果PrimaryKey 不为空,你可以Update 数据:

    public void UpdateOrAdd(Company model)
    
        if(model.CompanyID !=0) //The primary key
        
            db.Update(model);
            db.Entry(model).State = EntityState.Modified;
        
        else
                
           db.Company.Add(model);
         
        db.SaveChanges(); 
    

EF 在db.SaveChanges(); 方法之后创建一个PrimaryKey 值。

我建议你最后尝试使用 db.SaveChanges(); 方法。您可以收到错误消息并通过 SweetAlert 向自己显示,您可以给出正确的消息是操作 %100 是否成功。

【讨论】:

我了解更新和添加之间的区别。我的问题,我有很多方法基本上做同样的事情..更新或添加实体,例如用户表,公司表..有没有避免创建许多相同的方法,只有一个并传递我想要更新的实体/添加? 我从未尝试过,抱歉。我会搜索那个

以上是关于EF Core 为 dbContext 传递 TEntity 以执行更新或添加的主要内容,如果未能解决你的问题,请参考以下文章

Blazor 服务器:将 EF Core DbContextFactory 与 DbContext 混合

EF Core Scaffold DbContext

在 EF Core 中使用多个 dbContext

在单元测试期间避免在EF Core 2.2中使用HasData Seed DbContext

如何在 EF Core 中实例化 DbContext

EF CORE学习笔记 配置Dbcontext