动态访问实体框架DbSet

时间:2019-02-07 07:44:05

标签: c# asp.net-mvc entity-framework

此代码用于将表(实体)名称传递给控制器​​中的方法:

public JsonResult IsSubCategoryExist(string Name, int? ID, string ClassName)
{
        //my code..
}

ClassName是我需要从数据库中检索的表的名称。我的上下文定义:

ApplicationDbContext db = new ApplicationDbContext();

有人可以帮我吗?提前致谢。

2 个答案:

答案 0 :(得分:0)

answer of Viktor Bahtev to the duplicate question看起来像是一种魅力。我将在这里重复他的解决方案,以显示如果实体是在不是正在执行的程序集的另一个程序集中定义的,那么如何使程序集搜索实体类型。

这假定您的所有实体类都在同一已知程序集中。

DbContext db;
var assemblyName = "MyProject.MyEntities";
var entityName = "FooEntity";
long theEntityId = 1337;

var assembly = AppDomain.CurrentDomain.GetAssemblies()
                   .SingleOrDefault(a => a.GetName().Name == assemblyName);

var entityType = assembly.GetTypes()
                   .FirstOrDefault(t => t.Name == entityName);

var dbSet = db.Set(entityType);

var singleEntry = dbSet.Find(theEntityId);
var allEntries = dbSet.ToArray();

答案 1 :(得分:0)

您可以执行以下操作:

public async Task<JsonResult> IsSubCategoryExist(string Name, int? ID, string ClassName)
{
      var type = Assembly.GetExecutingAssembly()
                .GetTypes()
                .FirstOrDefault(t => t.Name == ClassName);

      if (type != null)
      {
         DbSet dbSet = _dbContext.Set(type);

         List<object> subCategories;
         if(ID == null)
         {
             subCategories = await dbSet.Where("Name == @0", Name) 
                                        .Take(1).ToListAsync();
         }
         else
         {
             subCategories = await dbSet.Where("Name == @0 and Id != @1", Name,ID)
                                        .Take(1).ToListAsync();
         }

         if(subCategories.Count > 0)
         {
            return Json(false,JsonRequestBehavior.AllowGet);
         }
         return Json(true,JsonRequestBehavior.AllowGet);
     }
     else
     {
        throw new Exception("Table name does not exist with the provided name");
     }
}

注意:不要忘记从Nuget安装System.Linq.Dynamic