Я решаю проблему.Первое: проблема есть;Когда я сопоставляю сущность для просмотра кода EF, сначала создайте миграцию с помощью ViewName.Это проблема, потому что я хочу использовать View вместо таблицы.Поэтому я решаю проблему с помощью этих инструкций;
1 - Я создаю BaseEntityConfiguration, которая унаследована от EntityTypeConfiguration, и все классы конфигурации сущности наследуются.например:
public class UserConfig: BaseEntityConfiguration<User> //Generic Type is Entity
{
public UserConfig()
{
}
}
2- Я создаю MapToViewAttribute, который унаследован от TableAttribute
public class MapToViewAttribute : TableAttribute
{
public string TableName { get; }
public string ViewName { get; }
public MapToViewAttribute(string tableName, string viewName) : base(viewName)
{
TableName = tableName;
ViewName = viewName;
}
}
3 - Я использую MapToViewAttribute, например, User Entity для использования View.
[MapToView("User","UserView")]
public class User
{
...
}
И в конструкторе BaseEntityConfiguration я получаю общий тип и пользовательские атрибуты.Если какой-либо объект имеет атрибут MapToView, я передаю параметр TableName в метод ToTable.Поэтому во время выполнения EF использует View для этих объектов, но не создает миграцию с RenameTable для этих объектов.
protected BaseEntityConfiguration()
{
var baseType = typeof(TEntityType);
var attributes = baseType.GetCustomAttributes(true);
foreach (var attr in attributes)
{
if (attr.GetType() == typeof(MapToViewAttribute))
{
var tableName = ((MapToViewAttribute)attr).TableName;
ToTable(tableName);
}
}
}
Последний EF не использует ваши файлы конфигурации, поэтому вы должны указать EF использовать его вМетод InternalModelCreate класса DbContext.Моя реализация такова:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var typesToRegister = Assembly.GetExecutingAssembly()
.GetTypes().Where(IsConfigurationType);
foreach (var type in typesToRegister)
{
dynamic configurationInstance = type.BaseType != null
&& type.BaseType.IsGenericType
&& type.BaseType.GetGenericTypeDefinition() == typeof(BaseEntityConfiguration<>)
? Activator.CreateInstance(type, culture)
: Activator.CreateInstance(type);
modelBuilder.Configurations.Add(configurationInstance);
}
modelBuilder.Types().Configure(t => t.ToTable(t.ClrType.Name));
BaseDbContext.InternalModelCreate(modelBuilder);
}
Но если вы используете этот подход, вы должны создать Вставить, Обновить и Удалить Триггеры / Правило (если вы используете триггер SQLServer, это вариант, но если вы используете правило postgresql, то это лучший вариант)потому что EF использует это представление для операций вставки, обновления и удаления.