Получить DbContext's DbSet <T>, где T - переменная - PullRequest
0 голосов
/ 03 мая 2018

У меня 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 голосов
/ 03 мая 2018

У DbContext вашего контекста данных есть метод с именем Set(Type t), который принимает тип, тип может быть создан из строки.

Для сценария, который вы описали, вы можете создать DbSet из строки в вашем XML с помощью

var typeName = "Some.Namespace.AndType";
DbSet t = Set(Type.GetType(typeName));

Обратите внимание, что вы не можете использовать выражения linq или lambda для запроса к результирующему объекту, если вы не приведете его к типизированному DbSet<T> или не используете библиотеку типа System.Linq.Dynamic, которая позволит вам вызывать t.AsQueryable().Where("SomeProperty == @value");, но это должен начать вас.

0 голосов
/ 03 мая 2018

С как проверить, существует ли dbcontext урегулирование в модели Вы можете просто проверить, существует ли он, затем получить 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);
}
...