【问题标题】:EF Core pass TEntity for dbContext to do Update or AddEF Core 为 dbContext 传递 TEntity 以执行更新或添加
【发布时间】: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(); 
    }

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

【问题讨论】:

    标签: entity-framework entity-framework-core dbcontext


    【解决方案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 是否成功。

      【讨论】:

      • 我了解更新和添加之间的区别。我的问题,我有很多方法基本上做同样的事情..更新或添加实体,例如用户表,公司表..有没有避免创建许多相同的方法,只有一个并传递我想要更新的实体/添加?
      • 我从未尝试过,抱歉。我会搜索那个
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多