我在代码优先的环境中使用唯一索引。它们的定义如下:
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);
}
但是由于大多数类都是内部的,因此您必须使用反射