如何从 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。
是否有可能以某种方式获得 Key
和 ForeignKey
?
有一个 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();
使用 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。
是否有可能以某种方式获得 Key
和 ForeignKey
?
有一个 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();