Как получить конфигурации предприятие с плавного 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 9

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();