C# 在实体框架中,如果没有一个switch语句枚举所有可能的数据库集,如何将通用实体添加到其相应的数据库集?

C# 在实体框架中,如果没有一个switch语句枚举所有可能的数据库集,如何将通用实体添加到其相应的数据库集?,c#,database,entity-framework,entity,C#,Database,Entity Framework,Entity,我有两种类型的实体:员工实体和办公室实体,两者之间有一对多的关系,因此一个办公室有许多员工。对于EF,将在每个实体的上下文文件中创建一个数据库集: public DbSet<Office> Offices { get; set; } public DbSet<Employee> Employees { get; set; } 基本上,我想强调的两件事是,Office对象被传递到方法中,Office通过显式写入db.Offices被添加到Office数据库集中: db.O

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

public DbSet<Office> Offices { get; set; }
public DbSet<Employee> Employees { get; set; }
基本上,我想强调的两件事是,Office对象被传递到方法中,Office通过显式写入db.Offices被添加到Office数据库集中:

db.Offices.Add(office);
但是,我需要编写一个方法,在该方法中可以传入一个泛型实体对象,并且可以将其添加到正确的DbSet中。我的方法大致是这样的(我忽略了所有MVC的东西):

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


我看到了,看起来它应该是有用的,但是我不知道它是如何工作的。

你可以考虑一个泛型类,例如:

 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();
    }

  }
公共类GenericRepository,其中T:class
{
内部语境;
内部数据库集;
公共通用存储库(YourContext)
{
this.context=上下文;
this.dbSet=context.Set();
}
公共虚拟无效插入(T实体)
{
添加(实体);
SaveChanges();
}
}

如果您有一个扩展方法,如

public static void Create<T>(this DbContext db, T entityToCreate)
    where T : class
{
    db.Set<T>().Add(entityToCreate);
    db.SaveChanges();
}

…不必担心类型。当然,您应该输入一个已知的实体类型。

有趣。我曾想过使用泛型类,但我对使用C#还不太熟悉,过去我也没有太多使用模板/泛型,所以我不确定这是否是我想要走的路。感谢您的帮助,我将进一步研究泛型并尝试您所说的内容。这将问题转移到:如何决定应该创建哪种类型的回购?尽管如此,使用
context.Set()
是关键,但它不应该用于泛型类型。Gert,你能详细说明一下你提出的问题吗?我对数据库和所有东西都不熟悉,所以我不知道你的意思。在某些情况下,您需要指定要保存的对象的类型。真的没有办法解决这个问题。我想您可以使用反射来确定类型,并使用Activator.CreateInstance()实例化泛型存储库,但这比简单的切换开销要大得多。
 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();
    }

  }
public static void Create<T>(this DbContext db, T entityToCreate)
    where T : class
{
    db.Set<T>().Add(entityToCreate);
    db.SaveChanges();
}
db.Create(office);