【问题标题】:Accessing Entity Framework DbSet dynamically [duplicate]动态访问实体框架 DbSet [重复]
【发布时间】:2019-02-07 07:44:04
【问题描述】:

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

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

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

ApplicationDbContext db = new ApplicationDbContext();

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

【问题讨论】:

  • @adiga - 感谢您的参考。在您的参考中,类型是已知的,并使用typeof 关键字进行翻译。而在我的情况下,类型是未知的。这取决于 ClassName 。如果我使用该方法并假设我的代码中有 1000 个不同的 ClassName 字符串,我将不得不对所有这 1000 个 ClassName 进行硬编码以将它们转换为表格。这是我希望避免的事情。
  • @RK 你试过我的答案了吗?
  • @TanvirArjel 是的。我现在坚持ClassName。我将它从我的Model 类作为Remote 属性上的参数传递给一个字符串值,但它以undefined 的形式出现。我在这里展示了它的实现:stackoverflow.com/questions/54551577/…

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


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 在线抛出错误:await dbSet.Where("Name == @0 and ID == @1", Name, ID).ToListAsync(); 在浏览器中声明:Operator '==' incompatible with operand types 'Int32' and 'Object'
  • 完成。谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 2011-07-15
    • 2013-02-10
    • 2016-12-21
    • 2011-08-13
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多