如何从Fluent Api检索实体配置

Die*_*uza 10 c# entity-framework entity-framework-6 ef-fluent-api

使用Entity-Framework 6我可以通过Fluent Api设置配置,如下所示:

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

来自这个问题

使用属性方法我能够通过反射了解属性角色是什么,但我想知道如何检索这些配置,Key例如,使用Fluent Api方法?

EntityTypeConfiguration<>班上没有公共财产.

有可能得到这个KeyForeignKey某种程度上?

Rez*_*aei 8

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

表示ADO.NET元数据运行时服务组件,该组件提供对从各种源检索元数据的支持.

有一个实例DbContext,你可以MetadataWorkspace使用以下代码找到它:

var metadataWorkspace = ((IObjectContextAdapter)dbContext).ObjectContext.MetadataWorkspace;
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用EntityType提取有关模型的更多信息,例如,您可以找到关键属性的列表:

var keys = dbcontext.GetEntityMetadata<Category>().KeyProperties.Select(x=>x.Name).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 太好了!这正是我所需要的.谢谢 (3认同)
  • 相关 - 本文帮助我理解并开发了解决方案:https://www.tabsoverspaces.com/230583-metadataworkspace-in-entity-framework?utm_source = blog.cincura.net (2认同)