获取DbContext的DbSet <t>,其中T是变量

时间:2018-05-03 05:42:37

标签: c# entity-framework dbcontext dbset

我的DbContext看起来有点像这样:

class MyDbContext: DbContext
{
    public DbSet<Class1> Set1 {get;set;}
    public DbSet<Class2> Set2 {get;set;}
    ...
}

其中Class1,Class2 ......:BaseClass
问题是我正在从xml读取数据,我使用的字典看起来像这样:

public class XmlNode
{
    public Func<BaseClass> CreateEntity { get; set; }
    ...
}

public static Dictionary<string, XmlNode> Nodes = new Dictionary<string, XmlNode>()
{
    ["Tag1"] = new XmlNode()
    {

        CreateEntity = () => new Class1(),
    }

    ...
}

然后我必须将读取实体与现有表格进行比较,然后添加它。但是我找不到一种方法来获得适当的表,而不是为每个类我都有不同的功能。有没有办法获得DbSet,其中Class是一个变量?

2 个答案:

答案 0 :(得分:1)

您的数据上下文派生的DbContext有一个名为Set(Type t)的方法,它接受一个类型,类型可以从字符串创建。

对于您所描述的方案,您可以通过

从XML中的字符串创建DbSet
var typeName = "Some.Namespace.AndType";
DbSet t = Set(Type.GetType(typeName));

请注意,您不能使用linq或lambda表达式来查询生成的对象,除非您将其强制转换为类型DbSet<T>或使用System.Linq.Dynamic之类的库,这样您就可以调用{{ 1}},但这应该让你开始。

答案 1 :(得分:0)

来自how to check whether dbcontext sett exists in model 您可以检查它是否存在,然后在检查后获取DBset

if(Exists<yourentity>())
{
   ... TEntity exist
}

来自链接

public bool Exists<TEntity>() where TEntity : class
{
    string entityName = typeof(TEntity).Name;
    ObjectContext objContext = ((IObjectContextAdapter)this).ObjectContext;
    MetadataWorkspace workspace = objContext.MetadataWorkspace;
    return workspace.GetItems<EntityType>(DataSpace.CSpace).Any(e => e.Name == entityName);
}