gpt4 book ai didi

c# - 以编程方式从 Entity Framework 6 的对象上下文中获取有关索引和约束的元数据

转载 作者:行者123 更新时间:2023-11-30 17:27:03 25 4
gpt4 key购买 nike

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

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

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

事实证明,使用 EF 做类似的事情相对容易。例如,您可以获得作为指定集合主键的属性名称列表,如下所示: Entity Framework code first. Find primary key . Entity Framework 还通过类似的方法方便地公开导航属性:EF5 How to get list of navigation properties for a domain object .

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


编辑:示例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: 'Sequence contains no matching element'

最佳答案

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

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);
}

但是由于大部分类都是内部的,所以你必须使用反射

关于c# - 以编程方式从 Entity Framework 6 的对象上下文中获取有关索引和约束的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55552266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com