Я беру пример отсюда ...
http://msmvps.com/blogs/kevinmcneish/archive/2009/12/03/entity-framework-programmatically-determining-the-entity-set-name-of-an-entity.aspx
... и рассмотрим только случай else
во фрагменте кода (поэтому у нас нет экземпляра сущности с ключом):
// I have tested with EF 4.1/DbContext, for EF 4.0 forget this line
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
Type entityType = typeof(Employee);
string entityTypeName = entityType.Name;
var container = objectContext.MetadataWorkspace.GetEntityContainer(
objectContext.DefaultContainerName, DataSpace.CSpace);
string entitySetName = (from meta in container.BaseEntitySets
where meta.ElementType.Name == entityTypeName
select meta.Name).First();
string fullEntitySetName = container.Name + "." + entitySetName;
Теперь проблема в том, что этот код выдает исключение в First()
, потому что нет BaseEntitySet
с именем типа элемента, равным «Сотрудник». Очевидно, потому что в модели есть только набор для базового типа = "Ресурс".
Возможное исправление - изменить вторую и третью строку выше на:
Type entityType = typeof(Employee);
while (entityType.BaseType.Name != "Object")
entityType = entityType.BaseType;
string entityTypeName = entityType.Name;
Это должно вернуть "Ресурсы" как entitySetName
IF ...
- Ваши сущности не являются производными от
EntityObject
(в этом случае это, вероятно, сработает, если вы замените "Object" на "EntityObject" в цикле while
выше)
- Ваши сущности не являются производными от другого пользовательского типа, который не является сущностью в модели. Например, если у вас
Resource
получено из базового типа MyBaseObject
, но вы не включили его в модель (нет DbSet<MyBaseObject>
или ObjectSet<MyBaseObject>
), вам придется заменить «Object» на «MyBaseObject» в цикле while
.
Второе ограничение нехорошо, поскольку в ваших классах сущностей могут быть разные базовые типы, не являющиеся моделями, что сделает приведенный выше код не очень применимым.
Возможно, есть более разумный способ получить базовый тип модели непосредственно из MetadataWorkspace
, но я не знаю.