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.Users
或 db.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】:Update
和 Add
之间的真正区别是 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 混合