通过Fluent API程序访问应用于DbContext的验证

本文关键字:DbContext 验证 应用于 访问 Fluent API 程序 通过 | 更新日期: 2023-09-27 18:26:27

考虑以下实体:

public partial class User
{
    public virtual long Id { get; set; }
    public virtual string Email { get; set; }
    public virtual long DepartmentId { get; set; }
    public virtual Department Department{ get; set; }
}
public partial class Department
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}
protected override void OnModelCreating (DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>();
    modelBuilder.Entity<User>().HasKey<long>(p => p.Id);
    modelBuilder.Entity<User>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    modelBuilder.Entity<User>().Property(p => p.Email).IsRequired().IsMaxLength();
    modelBuilder.Entity<Department>();
    modelBuilder.Entity<Department>().HasKey<long>(p => p.Id);
    modelBuilder.Entity<Department>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    modelBuilder.Entity<Department>().Property(p => p.Name).IsRequired().HasMaxLength(256);
}

我故意省略了上面的关系映射,因为它与问题无关。

我正在基于这些手写实体生成DTO和MVC模型,并希望以编程方式访问OnModelCreating方法中定义的属性配置。

我确实记得有一种方法可以使用DbContext对象访问模型/模式,但在各种搜索中都没有找到实现上述目的的方法。任何建议都将不胜感激。

UPDATE:在添加了下面答案中建议的代码后,我得到了一个奇怪的异常,对它的搜索是徒劳的。

Error   2   Running transformation: System.EntryPointNotFoundException: Entry point was not found.
   at System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()
   at Microsoft.VisualStudio.TextTemplating4060E50565D24E6D60BA3E80DDCE2A21E9485A5F4982CD591645549489576DC7687B06DE6C675CAA51175F177B32340E9E07C1C8B0487B2BD65D022D75892D00.GeneratedTextTransformation.TransformText()

通过Fluent API程序访问应用于DbContext的验证

我认为您想要的是元数据工作区:

var db = new YourDbContext();
var oc = ((IObjectContextAdapter)db).ObjectContext;
var mw = oc.MetadataWorkspace;

然后你可以通过它访问模型。例如,你可以获得所有实体的名称:

var entities = mw.GetItems<EntityType>(DataSpace.OSpace);
foreach (var entity in entities)
  Console.WriteLine(entity.Name);