如何从 Fluent Api 检索实体配置

Posted

技术标签:

【中文标题】如何从 Fluent Api 检索实体配置【英文标题】:How to retrieve Entity Configuration from Fluent Api 【发布时间】:2019-01-24 18:16:15 【问题描述】:

使用 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 Api 方法检索这些配置,例如Key

EntityTypeConfiguration&lt;&gt; 类没有公共属性。

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

【问题讨论】:

Fluent API 用于配置实体/关系,而不是获取/显示约束 @GkMoreira 这有帮助吗? ***.com/a/26680046/2441442 @ChristianGollhardt 以前有人推荐使用元数据工作区。经过一番研究,我用这种方法弄清楚了。它现在可以使用了,我将详细说明我已经实施的答案,以帮助有相同需求的任何人。 @ChristianGollhardt 事实上确实如此。谢谢。 【参考方案1】:

有一个MetadataWorkspace 类提供API 来检索有关实体框架的存储、模型、CLR 类型和映射的元数据。

表示 ADO.NET 元数据运行时服务组件,它 支持从各种来源检索元数据。

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

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

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

以下扩展方法为给定的 clr 类型返回 EntityType

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

【讨论】:

不错!这正是我所需要的。谢谢 相关 - 这篇文章帮助我理解和开发解决方案:tabsoverspaces.com/… IObjectContextAdapter 在 .NetCore 2.2 中是否仍然可用?我似乎找不到对 System.Data.Entity 的引用。 @RHarris 该问题被标记为 Entity Framework 6。这与 EF 核心无关。

以上是关于如何从 Fluent Api 检索实体配置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Fluent API 配置从 AspNetUsers 表到...的一对多关系

Code First约定-Fluent API配置

EF CodeFirst 之 Fluent API

译第24节---Fluent API - 属性映射

我是不是需要使用 Fluent API 配置与实体框架的关系的双方?

EF Fluent API上