2015-11-26 2 views
0

Как я могу получить список типов сущностей, которые являются частью модели, поэтому я могу проверить, что модель действительно работает с этим типом объекта?Получить все типы моделей

var dcx = new MyDbContext(); 
var lst = new List<Type>(); 
//populate the list here somehow 
//... 
foreach (var t in lst) { 
    var set = dcx.Set(t); //I'm trying to avoid an exception here 
    try { 
     var test = set.FirstOrDefault(); 
    } catch (Exception ex) { 
     Console.WriteLine("{0} has an error", t); 
    } 
} 

NB: Это вполне возможно запросить dcx.Set(t) даже если нет соответствующих DbSet собственности на MyDbContext; поэтому недостаточно повторять через отражение по свойствам MyDbContext, чье общее определение типа возврата DbSet<T> или даже IDbSet<T>.

+0

моделях или POCO которые будут разные типы, вы не можете создать список различных типов, можно только создать a Список того же типа, в данном случае список конкретного типа POCO или модели. Единственный вариант - List n = новый Список (); Я бы не рекомендовал этого. –

+0

@coderealm Я не уверен, что вы видите это правильно. Список - это «Список» типа «Тип», и оператор проходит через каждый «Тип» и получает кореспондентский «Набор» из контекста базы данных. Я не уверен, что вы можете избежать исключения здесь, хотя если вы переместите 'set = dcx.Set (t)' внутри try/catch (или поместите его в свой собственный try/catch), тогда вы можете хотя бы проглотить Это. В противном случае вы можете создать атрибут, который вы помещаете в классы моделей, которые вы можете запросить через отражение, чтобы получить все типы с этим атрибутом. –

+0

@coderealm Я могу создать «Список ', который содержит разные строки. 'System.Type' - это просто класс, содержащий информацию о заданном типе. –

ответ

0

Благодаря ссылке в @GertArnold 's comment, я сейчас, используя следующие:

var dcx = new MyDbContext(); 
var objContext = ((IObjectContextAdapter)dcx).ObjectContext; 
var types = db.ObjectContext.MetadataWorkspace.GetItems<EntityType>(DataSpace.OSpace).Select(x => Type.GetType(x.FullName)); 
foreach (var t in lst) { 
... 
+0

Это решение не работает. Также почему вызов db. когда есть dcx ?? – usefulBee

1

Возможно, что-то вроде этого?

var types = typeof(MyDbContext) 
    .GetProperties() 
    .Where(prop => prop.PropertyType.IsGenericType) 
    .Where(prop => prop.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)) 
    .Select(prop => prop.PropertyType.GenericTypeArguments.First()) 
    .Distinct(); 
+0

Я знаю, вы можете использовать отражение, чтобы достичь чего угодно. Лично плохой выбор, за исключением написания плагинов, потому что, если я начну думать о рефлексии, я должен подумать о повторной разработке решения. Потому что, используя отражение, вы буквально говорите, что я не знаю, чего ожидаю во время выполнения, но, пожалуйста, создайте для меня тип во время выполнения. Когда вы пишете свою собственную базу кода, вы знаете каждый тип перед запуском. –

+0

Протестировано и отредактировано. – missemisa

+0

@coderealm Это фактически в библиотеке классов, которая не знает определенных свойств в классах, наследуемых от DbContext. –

Смежные вопросы