【问题标题】:Dynamic DbSet in Entity Framework CoreEntity Framework Core 中的动态 DbSet
【发布时间】:2019-03-09 07:50:20
【问题描述】:
string tableName = "TblStudents";
Dictionary<string, Type> myDictionary = new Dictionary<string, Type>()
{
    { "TblStudents", typeof(TblStudent) },
    { "TblTeachers", typeof(TblTeacher) }
};

// Context always same
DBContext dbContext = new DBContext();
DbSet dbSet = dbContext.Set(myDictionary[tableName]);

上面的代码来自这个post,我可以在其中动态地DbSet。如何在 Entity Framework Core 中完成这项工作?

我收到一个错误

DbSet dbSet = dbContext.Set(myDictionary[tableName]);

似乎Set 方法在新版本中已更改。

感谢您的帮助。

【问题讨论】:

    标签: c# entity-framework-core dbset


    【解决方案1】:

    如果您想通过TEntity 获取DbSet&lt;TEntity&gt;,请使用:

    var dbSet = dbContext.Set<TEntity>();
    

    如果您想根据字符串名称和字典调用该方法,则必须使用反射。

    EF Core 似乎没有非泛型DbSet,因此您必须使用非泛型接口之一,例如IQueryable,并且我将包含一个您可以调用的Func如果您坚持使用字典映射路线,请获取 IQueryable 而不仅仅是类型。例如:

    var myDictionary = new Dictionary<string, Func<DbContext, IQueryable>>()
    {
        { "TblStudents", ( DbContext context ) => context.Set<TblStudent>() }
    };
    
    var dbSet = myDictionary[ "TblStudents" ].Invoke( dbContext );
    

    【讨论】:

    • 感谢您的回答。现在,如果我循环dbSet,我无法获得dbSet 中的属性,因为它是IQueryable 的一种类型。我该如何解决这个问题?
    • 得到什么属性?如果IQueryable 没有提供您需要的内容,请使用提供的接口。我不确定你想要完成什么。
    • 如果我要使用.Add.Remove怎么办...看起来这两种方法都不属于任何接口...希望我错了!
    猜你喜欢
    • 2019-12-06
    • 2022-08-20
    • 2021-08-23
    • 2020-08-31
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多