以编程方式从实体框架 6 的对象上下文中获取有关索引和约束的元数据



我在代码优先的环境中使用唯一索引。它们的定义如下:

modelBuilder.Entity<Foo>().HasIndex(foo => foo.Bar).IsUnique()

使用实体框架的元数据模型,我想以编程方式获取给定指定类型(在本例中为Foo)的索引(或约束)列表。

事实证明,使用 EF 执行类似操作相对容易。例如,您可以获取作为指定集的主键的属性名称列表,如下所示: 首先是实体框架代码。查找主键。实体框架还通过类似的方法方便地公开导航属性:EF5 如何获取域对象的导航属性列表。

(唯一)索引是否有类似的东西?


编辑:示例DbContext

public class Foo
{
public int Id { get; set; }
[Index]
public int SomeNumber { get; set; }
}
public class FooContext : DbContext
{
public DbSet<Foo> Foos { get; set; }
public FooContext() : base("DefaultConnection") { }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}

使用此DbContext,@Kahbazi获取PropertyIndexes的方法不起作用,它将是一个空集合。

当我使用流畅的 API 而不是显式DbSet时,使用以下代码:

modelBuilder.Entity<Foo>().HasIndex(foo => foo.SomeNumber);

。然后"Configuration"(参见@Kahbazi的答案)将从MetadataProperties中消失,导致System.InvalidOperationException:"序列不包含匹配的元素">

您可以使用此代码获取索引

Context context = new Context();
IObjectContextAdapter objectContextAdapter = (IObjectContextAdapter)context;
object configuration = objectContextAdapter.ObjectContext.CreateObjectSet<Foo>()
.EntitySet
.MetadataProperties
.Where(x => x.Name == "Configuration")
.First()
.Value;
var propertyIndexes = configuration.GetType().GetProperty("PropertyIndexes", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(configuration);
var list = (System.Collections.IEnumerable)propertyIndexes;
foreach (var item in list)
{
Console.WriteLine(item);
}

但是由于大多数类都是内部的,因此您必须使用反射

最新更新