我正在尝试在EF中为以下模式建模:
TEntity
包含每个TFile的记录:EntityId
是FileId
,而EntityType
是一个表示TFile
记录的常量值 - 还有其他以这种方式工作的表格。
TEntityFile
是一个查找表,我设法对此进行了建模,但已将其包含在内,以演示我必须配置/使用TEntity
的不同方法。此表将存储不同实体的查找到其文件。
我目前的配置:
// TEntity
EntityTypeConfiguration<TEntity> entityConfig = modelBuilder.Entity<TEntity>()
.ToTable("TEntity")
.HasKey(x => x.EntityGuid);
// TFile
EntityTypeConfiguration<TFile> fileConfig = modelBuilder.Entity<TFile>()
.ToTable("TFile")
.HasKey(x => x.FileId);
// TEntityFile
EntityTypeConfiguration<TEntityFile> entityFileConfig = modelBuilder.Entity<TEntityFile>()
.ToTable("TEntityFile")
.HasKey(x => new { x.EntityGuid, x.FileId });
entityFileConfig
.HasRequired(x => x.File)
.WithMany()
.HasForeignKey(x => x.FileId);
entityFileConfig
.HasRequired(x => x.Entity)
.WithMany()
.HasForeignKey(x => x.EntityGuid);
由于每个TFile
都是TEntity
,我想以这种方式为课程建模:
public class TFile : TEntity { }
我的问题在于告诉EF TFile
与TEntity
的关系,考虑到它使用以下字段进行映射:
在它生成的查询中,它希望EntityGuid
上的列TFile
加入。我可以用这种方式使用EF来建模这个模式吗?如果是这样,我需要更改哪些内容才能让EF了解如何将TFile
行与其对应的TEntity
行合并。
答案 0 :(得分:1)
底线是您的数据库架构未规范化,您无法创建使用数据库架构描述的概念模型,如下所示:
TEntity
和TFile
之间的N:N关系
虽然你的描述看起来好像你想要一个1:0..1
关系 - 除非你对TEntityFile
的每个PK字段都有唯一约束,但为什么要有这个表呢? EF概念模型也不了解唯一约束(至少在EF6及以下),因此即使使用唯一约束,也无法创建所需的概念模型。TEntity.EntityId
和TEntityFile.FileId
插入/更新/删除异常(例如,您可以更新
TEntity.EntityId
但不删除/修改相应的
TEntityFile
记录) - 我认为这违反了2NF 根据你的描述,听起来你想要EntityType
作为你的鉴别器(TPH违反3NF,顺便提一下,每个层次结构(TPH)继承,但很多人认为它是可接受的)但是你将需要为每个定义的类型单独的FK字段(例如:EntityId
将替换为FileId
的{{1}}字段。
另一种方法是使用Table-Per-Type(TPT)继承 - 这样就不需要EntityType == 1
鉴别器列,而是could reduce performance if joining from TEntity
to TFile
and other inherited entities。