代码之家  ›  专栏  ›  技术社区  ›  Diego Rafael Souza

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

  •  9
  • Diego Rafael Souza  · 技术社区  · 6 年前

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

    来源 this question

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

    没有公共财产 EntityTypeConfiguration<> 上课。

    有可能得到 ForeignKey 不知怎么的?

    1 回复  |  直到 5 年前
        1
  •  8
  •   Reza Aghaei    5 年前

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

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

    DbContext 元数据工作区 使用以下代码:

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

    以下扩展方法返回 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;
        }
    }
    

    那你就可以用 实体类型 要提取有关模型的更多信息,例如,可以找到键属性列表:

    var keys = dbcontext.GetEntityMetadata<Category>().KeyProperties.Select(x=>x.Name).ToList();