gpt4 book ai didi

c# - 在 Entity Framework 6 中使用自定义约定控制列映射

转载 作者:太空狗 更新时间:2023-10-29 17:50:19 24 4
gpt4 key购买 nike

我有一个 TypeEntity 类,它将作为几十个实体的基类。我正在使用 TPC,所以我需要将基类上的所有属性映射到具有具体类名称的表,并将 Key 字段设置为数据库生成。

目前我正在为每个实体类型使用 EntityTypeConfiguration 来执行此操作,如下所示:

class LineItemType : EntityTypeConfiguration<Models.LineItemType>
{
public LineItemType()
{
this.Property(e => e.Key)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

this.Map(e => e.MapInheritedProperties()
.ToTable(nameof(LineItemType)));
}
}

这工作正常,但非常重复。我必须记住为每个继承自 TypeEntity 的类型创建一个配置类,设置键并映射继承的属性。这似乎是自定义 Convention 的理想情况。


我创建了一个 TypeEntityTpcConvention Convention 如下:

class TypeEntityTpcConvention : Convention
{
public TypeEntityTpcConvention()
{
this.Types<TypeEntity>()
.Configure(e => e.Property(p => p.Key)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity));
}
}

这可以将 Key 设置为数据库生成的,但我找不到任何方法从约定内部访问属性的表映射。


理想情况下,我希望是这样的:

this.Types<TypeEntity>()
.Configure(e => e.MapInheritedProperties()
.ToTable(e.ClrType.Name));

或者甚至为每个需要映射的属性调用这样的方法:

this.Types<TypeEntity>()
.Configure(e => e.Property(p=>p.Key)
.ToTable(e.ClrType.Name));

这两个似乎都不存在。我有什么方法可以从 Convention 内部控制属性映射?


经过一些额外的研究,似乎有更高级的约定选项可用,如 IStoreModelConventionIConceptualModelConvention,但严重缺乏有关如何使用这些选项的有用文档。在使用断点和观察窗口浏览了几个小时之后,我也没有想出如何使用这些接口(interface)来控制列映射。


我目前的解决方案是使用反射在 OnModelCreating 中查找所有从 TypeEntity 继承的类型,并将属性映射到正确的表。这行得通,但如果可能的话,我更愿意使用约定,因为这看起来确实像是约定俗成的类型。我觉得我错过了一些明显的东西。

最佳答案

据我所知,您可以在 DbContextOnModelCreating 方法中编写类型配置,它与您在问题。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

modelBuilder.Types<TypeEntity>().Configure(c =>
{
c.HasKey(p => p.Key);
// probably not needed, but won't do any harm
c.Property(p => p.Key).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
c.ToTable(c.ClrType.Name);
});
}

如果此方法有任何问题,请告诉我,我将重新讨论该主题。

编辑:

完全相同的原则可以应用于约定:

class TypeEntityConvention : Convention
{
public TypeEntityConvention()
{
this.Types<TypeEntity>().Configure(c =>
{
c.HasKey(p => p.Key);
c.Property(p => p.Key).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
c.ToTable(c.ClrType.Name);
});
}
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

modelBuilder.Conventions.Add<TypeEntityConvention>();
}

关于c# - 在 Entity Framework 6 中使用自定义约定控制列映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46065971/

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