gpt4 book ai didi

c# - 在 Entity Framework 中,如何在没有枚举所有可能 DbSet 的 switch 语句的情况下将通用实体添加到其相应的 DbSet?

转载 作者:太空狗 更新时间:2023-10-29 22:18:49 25 4
gpt4 key购买 nike

我有两种类型的实体:员工实体和办公室实体,两者之间存在一对多关系,因此一个办公室有很多员工。对于 EF,在上下文文件中为每个实体创建一个 DbSet:

public DbSet<Office> Offices { get; set; }
public DbSet<Employee> Employees { get; set; }

我做的一个 EF 教程让我为特定实体执行 CRUD 方法。例如,下面的方法创建一个办公室并将其添加到办公室 DbSet(忽略 MVC 的东西——我不再这样做了):

public ActionResult Create([Bind(Include = "Address,BusinessName")] Office office)
{
try
{

if (ModelState.IsValid)
{
db.Offices.Add(office);
db.SaveChanges();
return RedirectToAction("Index");
}

}
catch (DataException /* dex */)
{
//Log the error (uncomment dex variable name and add a line here to write a log.
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
}
return View(office);
}

基本上我想强调的两件事是将 Office 对象传递到方法中,并通过显式编写 db.Offices 将办公室添加到 Office DbSet:

db.Offices.Add(office);

但是,我需要编写一个可以传入通用实体对象的方法,并且我可以将其添加到其正确的 DbSet 中。我的方法的粗略想法是这样的(我忽略了所有 MVC 的东西):

public void Create(object entityToCreate)
{
db.CorrespondingEntityType.Add(entityToCreate);
db.SaveChanges();
}

假设我有一个 Employee 对象。我可以将这个 Employee 传递给 Create 方法,它可以看到这是一个 Employee,因此它会将它添加到 Employees DbSet。我不知道 EF 是否支持这个。另一种方法是创建一个 switch 语句,这种方式取决于传入的实体类型,我可以直接调用哪个 DbSet 来将实体添加到。但我想避免这种情况,因为我将与更多的实体合作,而不仅仅是这两个。此外,我将不得不为其他 CRUD 方法做类似的事情。

我看到了this documentation from msdn about the ObjectSet.AddObject Method ,看起来应该有用,但我不确定它是如何工作的。

最佳答案

您可能会考虑像这样的通用类:

 public class GenericRepository<T> where T : class
{
internal YourConext context;
internal DbSet<T> dbSet;

public GenericRepository(YourContext context)
{
this.context = context;
this.dbSet = context.Set<T>();
}

public virtual void Insert(T entity)
{
dbSet.Add(entity);
context.SaveChanges();
}

}

关于c# - 在 Entity Framework 中,如何在没有枚举所有可能 DbSet 的 switch 语句的情况下将通用实体添加到其相应的 DbSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30675564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com