Использование отражения в EF6 OnModelCreating для переименования всех свойств DbSet в нижний регистр.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Использование отражения в EF6 OnModelCreating для переименования всех свойств DbSet в нижний регистр.

Сообщение Anonymous »

Я работаю над проектом C# Winforms (ориентированным на .NET Framework 4.6.1) и хочу отразить эту функцию для каждого DbSet:

Код: Выделить всё

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Property(e => e.Name)
.HasColumnName("name");
}
Мне нужно автоматизировать настройку моего метода OnModelCreating. Это необходимо, потому что по причинам устаревшего мне приходится создавать все столбцы базы данных в нижнем регистре в PostgreSQL. Я не нашел в PostgreSQL настройки, которая позволяла бы мне запрашивать таблицы типа SELECT * FROM User без использования кавычек, если только таблицы и столбцы не созданы в нижнем регистре. Кроме того, использование аннотаций к данным не является вариантом, поскольку мне это нужно в случае с Pascal по другой причине.
Я успешно преобразовал имена таблиц в нижний регистр, но у меня возникают проблемы с динамической настройкой имен свойств. (т. е. имена столбцов) с использованием отражения.
Вот подход, который я сейчас использую:

Код: Выделить всё

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Dynamically iterate through all DbSet properties
var dbSetProperties = this.GetType().GetProperties()
.Where(p => p.PropertyType.IsGenericType &&
p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet));

foreach (var property in dbSetProperties)
{
var entityType = property.PropertyType.GenericTypeArguments[0]; // Entity type
var tableName = entityType.Name.ToLower(); // Convert table name to lowercase

// Register the entity and set the table name
var method = modelBuilder.GetType()
.GetMethod("Entity", new Type[] { })
.MakeGenericMethod(entityType); // Create generic method

var entityConfiguration = method.Invoke(modelBuilder, null); // Call the Entity method

// Set the table name
var toTableMethod = entityConfiguration.GetType()
.GetMethod("ToTable", new[] { typeof(string) });
toTableMethod.Invoke(entityConfiguration, new object[] { tableName });
}
}
Однако мне также нужно установить строчные буквы для имен свойств (имен столбцов), но я не уверен, как это сделать динамически.
Пока я дошел до этой точки, но мне всегда не удается загрузить метод свойства и использовать для него лямбда-выражение.

Код: Выделить всё

void LowerProperties(DbModelBuilder modelBuilder)
{
var dbSetProperties = this.GetType()
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.PropertyType.IsGenericType &&
p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet));

foreach (var dbSetProperty in dbSetProperties)
{
Type entityType = dbSetProperty.PropertyType.GetGenericArguments()[0];

var properties = entityType.GetProperties();

foreach (var property in properties)
{
string propertyName = property.Name;

MethodInfo entityMethod = modelBuilder.GetType()
.GetMethod("Entity")
.MakeGenericMethod(entityType);

object entityConfig = entityMethod.Invoke(modelBuilder, null);

ParameterExpression param = Expression.Parameter(entityType, "e");
MemberExpression propertyAccess = Expression.Property(param, propertyName);
LambdaExpression lambda = Expression.Lambda(propertyAccess, param);

Type configType = typeof(StructuralTypeConfiguration).MakeGenericType(entityType);

dynamic typ;

if (property.PropertyType == typeof(int))
{
typ = typeof(Func).MakeGenericType(entityType, typeof(decimal));
}
else
{
typ = typeof(Func).MakeGenericType(entityType, property.PropertyType);
}

MethodInfo propertyMethod = configType.GetMethod("Property",
BindingFlags.Public | BindingFlags.Instance,
null,
new Type[] { typ },
null);

object stringPropertyConfig = propertyMethod.Invoke(entityConfig, new object[] { lambda });

MethodInfo hasColumnNameMethod = stringPropertyConfig.GetType()
.GetMethod("HasColumnName", new[] { typeof(string) });

hasColumnNameMethod.Invoke(stringPropertyConfig, new object[] { propertyName.ToLower() });

}
}
}
Может ли кто-нибудь помочь мне понять, как этого добиться?

Подробнее здесь: https://stackoverflow.com/questions/791 ... -to-lowerc
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»