Я создал соглашение 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));
Он будет работать только тогда, когда производный класс находится в том же пространстве имен в качестве базового класса, хотя. Поэтому, если у кого-то есть другие предложения, пожалуйста, помогите!
Это не делает Работа. Переменная 'entitySet' относится к объекту типа' EntitySet', а не к фактическому типу базового класса, который он представляет. –