Entity Framework: Как получить EntitySetName объекта TPT или TPH - PullRequest
2 голосов
/ 12 октября 2011

У меня есть сущность Employee, которая наследуется от сущности Person, которая наследуется от сущности Resource (Employee -> Person -> Resource). Можно ли программно получить EntitySetName сотрудника (который должен быть Ресурсами)?

1 Ответ

3 голосов
/ 12 октября 2011

Я беру пример отсюда ...

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, но я не знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...