C# 如何从Fluent Api检索实体配置
使用Entity Framework 6,我可以通过Fluent Api设置配置,如下所示:C# 如何从Fluent Api检索实体配置,c#,.net,entity-framework,entity-framework-6,ef-fluent-api,C#,.net,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 =>
public class ApplicationUserConfiguration : EntityTypeConfiguration<ApplicationUser>
{
public ApplicationUserConfiguration()
{
this.HasKey(d => d.Id);
this.Ignore(d => d.UserId);
}
}
公共类ApplicationUserConfiguration:EntityTypeConfiguration
使用属性方法,我可以通过反射知道什么是属性角色,但我想知道如何检索这些配置,例如使用Fluent-Api方法检索Key
EntityTypeConfiguration
类中没有公共属性
有没有可能以某种方式获取键
和外键
?有一个类,它提供API来检索实体框架的存储、模型、CLR类型和映射的元数据
表示所需的ADO.NET元数据运行时服务组件
提供对从各种源检索元数据的支持
有一个DbContext
的实例,您可以使用以下代码找到它的MetadataWorkspace
:
var metadataWorkspace = ((IObjectContextAdapter)dbContext).ObjectContext.MetadataWorkspace;
然后,您可以获得包含不同类型模型的项集合,包括对象模型、概念模型、存储(数据库)模型以及概念模型和存储模型之间的映射模型
对于给定的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;
}
}
fluent API用于配置实体/关系,而不是获取/显示constraints@GkMoreira这有用吗@ChristianGollhardt之前有人建议使用metadataworkspace。经过一些研究,我用这种方法找到了答案。现在它已经可以使用了,我将详细说明一个答案,我已经实现了这个答案来帮助任何有同样需要的人。@ChristianGollhardt事实上它是这样的。谢谢,很好!这正是我需要的。感谢相关-本文帮助我理解并开发了解决方案:IObjectContextAdapter
在.NetCore 2.2中仍然可用吗?我似乎找不到对System.Data.Entity的引用。@RHarris该问题用Entity Framework 6标记。这与EF core无关。
var keys = dbcontext.GetEntityMetadata<Category>().KeyProperties.Select(x=>x.Name).ToList();