Entity Framework 继承 - 解决具有相同父级的实体之间的关系
Entity Framework Inheritance - Resolve Relations between entities with same parent
这是我的模型
我需要将此模型映射到 Entity Framework,但我的结果是只构建了一个名为 Fluxo 的 table,并且有很多丑陋的 FK。
此外,我不知道如何映射我的 PK,定义在 Fluxo class
这是我的映射
public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
public FluxoPrincipalMap()
{
HasRequired(f => f.CasoDeUso).WithOptional(c => c.FluxoPrincipal);
}
}
public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
public FluxoAlternativoMap()
{
}
}
class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
public FluxoDeExcecaoMap()
{
}
}
更新 1 - 一些映射改进后
好的,这是我的新映射
public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
public FluxoPrincipalMap()
{
ToTable(nameof(FluxoPrincipal));
HasKey(x => x.FluxoId);
Property(x => x.FluxoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(f => f.CasoDeUso).WithOptional(c => c.FluxoPrincipal);
Ignore(f => f.ValidationResult);
Ignore(f => f.IsValid);
}
}
public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
public FluxoAlternativoMap()
{
ToTable(nameof(FluxoAlternativo));
HasKey(x => x.FluxoId);
Property(x => x.FluxoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(x => x.FluxoPrincipal)
.WithMany(x => x.FluxosAlternativos)
.HasForeignKey(x => x.FluxoPrincipalId);
Ignore(x => x.ValidationResult);
Ignore(x => x.IsValid);
}
}
class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
public FluxoDeExcecaoMap()
{
ToTable(nameof(FluxoDeExcecao));
HasKey(x => x.FluxoId);
Property(x => x.FluxoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(x => x.FluxoPrincipal)
.WithMany(x => x.FluxosDeExcecao)
.HasForeignKey(x => x.FluxoPrincipalId);
Ignore(x => x.ValidationResult);
Ignore(x => x.IsValid);
}
}
这是我的上下文配置
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
modelBuilder.Properties()
// ReSharper disable once PossibleNullReferenceException
.Where(p => p.Name == p.ReflectedType.Name + "Id")
.Configure(p => p.IsKey());
modelBuilder.Properties<string>()
.Configure(p => p.HasColumnType("varchar"));
modelBuilder.Properties<string>()
.Configure(p => p.HasMaxLength(100));
modelBuilder.Configurations.Add(new ProjetoMap());
modelBuilder.Configurations.Add(new RequisitoMap());
modelBuilder.Configurations.Add(new CasoDeUsoMap());
modelBuilder.Configurations.Add(new FluxoPrincipalMap());
modelBuilder.Configurations.Add(new FluxoAlternativoMap());
modelBuilder.Configurations.Add(new FluxoDeExcecaoMap());
base.OnModelCreating(modelBuilder);
}
在 Entity Framework 中有 3 种使用继承的方法,您可以在此处查看所有方法:http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph
- Table per Hierarchy (TPH): 通过反规范化启用多态性
SQL 模式,并利用保存类型的类型鉴别器列
信息。
- Table per Type (TPT):表示"is a"(继承)
关系为 "has a"(外键)关系。
- Table 每
具体class(TPC): 抛弃多态和继承
完全来自 SQL 模式的关系。
THP
public class Context : DbContext
{
public DbSet<Fluxo> Fluxo { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}
}
public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
public FluxoPrincipalMap()
{
HasKey(x => x.FluxoID);
}
}
public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
public FluxoAlternativoMap()
{
HasKey(x => x.FluxoID);
}
}
class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
public FluxoDeExcecaoMap()
{
HasKey(x => x.FluxoID);
}
}
TPT
public class Context : DbContext
{
public DbSet<FluxoPrincipal> FluxoPrincipal { get; set; }
public DbSet<FluxoAlternativo> FluxoAlternativo { get; set; }
public DbSet<FluxoDeExcecao> FluxoDeExcecao { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}
}
public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
public FluxoPrincipalMap()
{
HasKey(x => x.FluxoID);
}
}
public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
public FluxoAlternativoMap()
{
HasKey(x => x.FluxoID);
}
}
class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
public FluxoDeExcecaoMap()
{
HasKey(x => x.FluxoID);
}
}
TPC
public class Context : DbContext
{
public DbSet<FluxoPrincipal> FluxoPrincipal { get; set; }
public DbSet<FluxoAlternativo> FluxoAlternativo { get; set; }
public DbSet<FluxoDeExcecao> FluxoDeExcecao { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}
}
public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
public FluxoPrincipalMap()
{
HasKey(x => x.FluxoID);
Map(x => x.MapInheritedProperties());
}
}
public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
public FluxoAlternativoMap()
{
HasKey(x => x.FluxoID);
Map(x => x.MapInheritedProperties());
}
}
class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
public FluxoDeExcecaoMap()
{
HasKey(x => x.FluxoID);
Map(x => x.MapInheritedProperties());
}
}
这是我的模型
我需要将此模型映射到 Entity Framework,但我的结果是只构建了一个名为 Fluxo 的 table,并且有很多丑陋的 FK。
此外,我不知道如何映射我的 PK,定义在 Fluxo class
这是我的映射
public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
public FluxoPrincipalMap()
{
HasRequired(f => f.CasoDeUso).WithOptional(c => c.FluxoPrincipal);
}
}
public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
public FluxoAlternativoMap()
{
}
}
class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
public FluxoDeExcecaoMap()
{
}
}
更新 1 - 一些映射改进后
好的,这是我的新映射
public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
public FluxoPrincipalMap()
{
ToTable(nameof(FluxoPrincipal));
HasKey(x => x.FluxoId);
Property(x => x.FluxoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(f => f.CasoDeUso).WithOptional(c => c.FluxoPrincipal);
Ignore(f => f.ValidationResult);
Ignore(f => f.IsValid);
}
}
public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
public FluxoAlternativoMap()
{
ToTable(nameof(FluxoAlternativo));
HasKey(x => x.FluxoId);
Property(x => x.FluxoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(x => x.FluxoPrincipal)
.WithMany(x => x.FluxosAlternativos)
.HasForeignKey(x => x.FluxoPrincipalId);
Ignore(x => x.ValidationResult);
Ignore(x => x.IsValid);
}
}
class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
public FluxoDeExcecaoMap()
{
ToTable(nameof(FluxoDeExcecao));
HasKey(x => x.FluxoId);
Property(x => x.FluxoId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(x => x.FluxoPrincipal)
.WithMany(x => x.FluxosDeExcecao)
.HasForeignKey(x => x.FluxoPrincipalId);
Ignore(x => x.ValidationResult);
Ignore(x => x.IsValid);
}
}
这是我的上下文配置
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
modelBuilder.Properties()
// ReSharper disable once PossibleNullReferenceException
.Where(p => p.Name == p.ReflectedType.Name + "Id")
.Configure(p => p.IsKey());
modelBuilder.Properties<string>()
.Configure(p => p.HasColumnType("varchar"));
modelBuilder.Properties<string>()
.Configure(p => p.HasMaxLength(100));
modelBuilder.Configurations.Add(new ProjetoMap());
modelBuilder.Configurations.Add(new RequisitoMap());
modelBuilder.Configurations.Add(new CasoDeUsoMap());
modelBuilder.Configurations.Add(new FluxoPrincipalMap());
modelBuilder.Configurations.Add(new FluxoAlternativoMap());
modelBuilder.Configurations.Add(new FluxoDeExcecaoMap());
base.OnModelCreating(modelBuilder);
}
在 Entity Framework 中有 3 种使用继承的方法,您可以在此处查看所有方法:http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph
- Table per Hierarchy (TPH): 通过反规范化启用多态性 SQL 模式,并利用保存类型的类型鉴别器列 信息。
- Table per Type (TPT):表示"is a"(继承) 关系为 "has a"(外键)关系。
- Table 每 具体class(TPC): 抛弃多态和继承 完全来自 SQL 模式的关系。
THP
public class Context : DbContext
{
public DbSet<Fluxo> Fluxo { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}
}
public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
public FluxoPrincipalMap()
{
HasKey(x => x.FluxoID);
}
}
public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
public FluxoAlternativoMap()
{
HasKey(x => x.FluxoID);
}
}
class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
public FluxoDeExcecaoMap()
{
HasKey(x => x.FluxoID);
}
}
TPT
public class Context : DbContext
{
public DbSet<FluxoPrincipal> FluxoPrincipal { get; set; }
public DbSet<FluxoAlternativo> FluxoAlternativo { get; set; }
public DbSet<FluxoDeExcecao> FluxoDeExcecao { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}
}
public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
public FluxoPrincipalMap()
{
HasKey(x => x.FluxoID);
}
}
public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
public FluxoAlternativoMap()
{
HasKey(x => x.FluxoID);
}
}
class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
public FluxoDeExcecaoMap()
{
HasKey(x => x.FluxoID);
}
}
TPC
public class Context : DbContext
{
public DbSet<FluxoPrincipal> FluxoPrincipal { get; set; }
public DbSet<FluxoAlternativo> FluxoAlternativo { get; set; }
public DbSet<FluxoDeExcecao> FluxoDeExcecao { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}
}
public class FluxoPrincipalMap : EntityTypeConfiguration<FluxoPrincipal>
{
public FluxoPrincipalMap()
{
HasKey(x => x.FluxoID);
Map(x => x.MapInheritedProperties());
}
}
public class FluxoAlternativoMap : EntityTypeConfiguration<FluxoAlternativo>
{
public FluxoAlternativoMap()
{
HasKey(x => x.FluxoID);
Map(x => x.MapInheritedProperties());
}
}
class FluxoDeExcecaoMap : EntityTypeConfiguration<FluxoDeExcecao>
{
public FluxoDeExcecaoMap()
{
HasKey(x => x.FluxoID);
Map(x => x.MapInheritedProperties());
}
}