Как получить конфигурации предприятие с плавного API
Используя Entity-Framework 6, я могу настроить конфигурацию через Fluent Api следующим образом:
public class ApplicationUserConfiguration : EntityTypeConfiguration<ApplicationUser>
{
public ApplicationUserConfiguration()
{
this.HasKey(d => d.Id);
this.Ignore(d => d.UserId);
}
}
источник из этого вопроса
Используя атрибутивный подход, я могу узнать, что такое роли свойств по отражению, но мне интересно, как я могу получить эти конфигурации, такие как Key
, например, с помощью Fluent Api?
Нет никакой общественной собственности из класса EntityTypeConfiguration<>
.
Можно ли как-то получить Key
и ForeignKey
?
1 ответ:
Существует
MetadataWorkspace
класс, предоставляющий API для получения метаданных о хранилище, модели, типах среды CLR и сопоставлениях для Entity Framework.Представляет собой ADO.NET компонент службы среды выполнения метаданных, который обеспечивает поддержку извлечения метаданных из различных источников.
Имея экземпляр
DbContext
, Вы можете найти егоMetadataWorkspace
, Используя следующий код:var metadataWorkspace = ((IObjectContextAdapter)dbContext).ObjectContext.MetadataWorkspace;
Затем вы можете получить коллекции элементов, которые содержат различные типы моделей, включая объектная модель, концептуальная модель, модель хранения (базы данных) и модель сопоставления между концептуальной моделью и моделью хранения.
Следующие методы расширения возвращают
EntityType
для данного типа clr:using System; using System.Data.Entity; using System.Data.Entity.Core.Metadata.Edm; using System.Data.Entity.Infrastructure; using System.Linq; public static class DbContextExtensions { public static EntityType GetEntityMetadata<TEntity>(this DbContext dbContext) { if (dbContext == null) throw new ArgumentNullException(nameof(dbContext)); var metadataWorkspace = ((IObjectContextAdapter)dbContext) .ObjectContext.MetadataWorkspace; var itemCollection = ((ObjectItemCollection)metadataWorkspace .GetItemCollection(DataSpace.OSpace)); var entityType = metadataWorkspace.GetItems<EntityType>(DataSpace.OSpace) .Where(e => itemCollection.GetClrType(e) == typeof(TEntity)).FirstOrDefault(); if (entityType == null) throw new Exception($"No entity mapped to CLR type '{typeof(TEntity)}'."); return entityType; } }
Затем вы можете использовать
EntityType
для извлечения дополнительной информации о модели, например, вы можете найти список ключевых свойств:var keys = dbcontext.GetEntityMetadata<Category>().KeyProperties.Select(x=>x.Name).ToList();