2016-04-01 3 views
1

Я создал соглашение EF, которое устанавливает имя схемы для класса на основе интерфейса, который он реализует прямо или косвенно.Как получить тип объекта из EF EntitySet

public class TableNameConvention<T> : IStoreModelConvention<EntitySet> 
{ 
    private readonly string SchemaName; 

    public TableNameConvention(string schemaName) 
    { 
     this.SchemaName = schemaName; 
    } 

    public virtual void Apply(EntitySet entitySet, DbModel model) 
    { 
     // Get the name of the Entity 
     string name = entitySet.Name; 

     // Check TEntityType Assembly for entitySet type 
     Type type = typeof(T).Assembly.GetTypes().Where(x => x.Name == name).SingleOrDefault(); 

     // Check if type was found 
     if (type != null) 
     { 
      // Check if type implements Type Parameter and if so, set schema 
      if (typeof(T).IsAssignableFrom(type)) entitySet.Schema = SchemaName; 
     } 

     entitySet.Table = FormatName(name); 
    } 

Это нормально работает в 95% случаев. Однако, если в Ассамблее есть еще один класс с тем же именем, он вернет значение по умолчанию. Я могу изменить это на FirstOrDefault, но по-прежнему нет гарантии, что первый из них я на самом деле ищу.

Я знаю, что без полноценного имени он никогда не будет на 100%, но есть ли у кого-нибудь какие-либо предложения, которые помогут улучшить шансы получить правильный тип?

UPDATE

я изменил следующее:

Type type = AppDomain.CurrentDomain.GetAssemblies() 
         .SelectMany(t => t.GetTypes()) 
         .Where(t => t.IsClass && t.Namespace == typeof(T).Namespace) 
         .FirstOrDefault(t => t.Name.Equals(name)); 

Он будет работать только тогда, когда производный класс находится в том же пространстве имен в качестве базового класса, хотя. Поэтому, если у кого-то есть другие предложения, пожалуйста, помогите!

ответ

0

Короткий ответ, что нет никакого способа, чтобы получить субъект фактической Type непосредственно с EF EntitySet, по крайней мере, не в модели хранения.

Чтобы сделать код выше работы, я обновил класс следующим образом:

private readonly string SchemaName; 
private readonly string Namespace; 

public TableNameConvention(string schemaName, string @namespace) 
{ 
    this.SchemaName = schemaName; 
    this.Namespace = @namespace; 
} 

, а затем обновлен, где метод на запросе Linq для получения типа из AppDomain

Type type = AppDomain.CurrentDomain.GetAssemblies() 
        .SelectMany(t => t.GetTypes()) 
        .Where(t => t.IsClass && t.Namespace == this.Namespace) 
        .FirstOrDefault(t => t.Name.Equals(name)); 
0

Будет ли это работать?

 // Check TEntityType Assembly for entitySet type 
     Type type = typeof(T).Assembly.GetTypes().Where(x => x == entitySet.GetType()).SingleOrDefault(); 
+0

Это не делает Работа. Переменная 'entitySet' относится к объекту типа' EntitySet', а не к фактическому типу базового класса, который он представляет. –

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