我的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是一个变量?
答案 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);
}