我有一个简单的情况,在某些关系中,表ID
字段用作关键参考。但在其他较旧的实现中,Name
字段被用作关系映射。
FileType:
ID | Name |....
FileTypeDetails:
ID | FileTypeId | ....
PostingGroupDetails :
FileType | ....
PostingGroupDetails.FileType
的地图为FileType.Name
。 FileTypeDetails.FileTypeId
映射到FileType.ID
。
我正在使用Fluent API结构手动执行映射,但是我遇到了这种关系映射的问题。
我虽然做多键映射可能有用,但我不确定。仍处于设计阶段,即将实施项目的界面。
关于如何使映射可用于两者的任何想法,直到我们可以将关系映射合并到一个或另一个?
我知道FileType
目前是可选的,但它只与Table设计直接相关。我正在为模式更新标记它,目前在实践中它是一个必填字段,以便提交条目。
ToTable( "FileType" , "Int" );
HasKey( ftd => ftd.ID );
Property( ftd => ftd.ID ).HasColumnName( "ID" )
.HasDatabaseGeneratedOption( DatabaseGeneratedOption.Identity );
Property( ftd => ftd.Name).HasColumnName( "Name" )
.IsOptional();
//Navigation Properties
HasMany( ftd => ftd.FileNames )
.WithRequired( fn => fn.FileType );
HasMany( ftd => ftd.PostingGroupDetails )
.WithRequired( pgd => pgd.FileTypeDetails );
FileNames.FileTypeID
与FileType.ID
ToTable( "FileNames" , "Int" );
HasKey( fn => fn.ID );
Property( fn => fn.ID ).HasColumnName( "ID" )
.HasDatabaseGeneratedOption( DatabaseGeneratedOption.Identity );
Property( fn => fn.FileTypeID ).HasColumnName( "FileTypeID" )
.IsRequired();
//Navigation Properties
HasRequired( fn => fn.FileType )
.WithMany( ftd => ftd.FileNames )
.HasForeignKey( fn => fn.FileTypeID );
PostingGroupDetails.FileType
与FileType.Name
ToTable( "PostingGroupDetails " , "Int" );
HasKey( pgd => pgd.ID );
Property( pgd => pgd.ID ).HasColumnName( "ID" )
.HasDatabaseGeneratedOption( DatabaseGeneratedOption.Identity );
//Required Properties
Property( pgd => pgd.FileType ).HasColumnName( "FileType" )
.IsRequired();
//Navigation Properties
HasRequired( pgd => pgd.FileTypeDetails )
.WithMany( ftd => ftd.PostingGroupDetails );
任何想法都将不胜感激。重构数据库结构现在不是一个选项,但是它已经完成了。
答案 0 :(得分:1)
实体框架允许数据库模型和类模型(或概念模型)之间的差异。您可以在概念模型中定义主键,这些主键在数据模型中不存在,或者甚至不被限制为唯一键。
因此,您可以(并且必须)选择要在概念模型中标记为PK的字段。您只能定义与概念模型中定义的PK的关联,并且每个实体只能有一个PK。因此,对于FileType
,您必须选择ID
或Name
,然后才能定义与FileTypeDetails
或 PostingGroupDetails
的关联。对于您知道存在的其他关联,您必须编写连接查询。如在
from x in X
join y from Y on x.Name equals y.Name
select ...