如何从 Fluent Api 中检索实体配置

How to retrieve Entity Configuration from Fluent Api

使用 Entity-Framework 6 我可以像这样通过 Fluent Api 设置配置:

public class ApplicationUserConfiguration : EntityTypeConfiguration<ApplicationUser>
{
    public ApplicationUserConfiguration()
    {
        this.HasKey(d => d.Id);
        this.Ignore(d => d.UserId);
    }
}

来源自this question

使用属性方法,我可以通过反射知道 属性 角色是什么,但我想知道如何使用 Fluent [=29] 检索这些配置,例如 Key =]方法?

public 属性 来自 EntityTypeConfiguration<> class。

是否有可能以某种方式获得 KeyForeignKey

有一个 MetadataWorkspace class,它提供 API 来检索有关 Entity Framework 的存储、模型、CLR 类型和映射的元数据。

Represents the ADO.NET metadata runtime service component that provides support for retrieving metadata from various sources.

有了 DbContext 的实例,您可以使用以下代码找到它的 MetadataWorkspace

var metadataWorkspace = ((IObjectContextAdapter)dbContext).ObjectContext.MetadataWorkspace;

然后您可以获得包含不同类型模型的项目集合,包括对象模型、概念模型、存储(数据库)模型以及概念模型和存储模型之间的映射模型。

以下扩展方法 returns 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();