导航属性映射在两个不同的字段上

时间:2014-01-27 17:43:47

标签: entity-framework fluent

我有一个简单的情况,在某些关系中,表ID字段用作关键参考。但在其他较旧的实现中,Name字段被用作关系映射。

FileType:
ID | Name |....

FileTypeDetails:
ID | FileTypeId | ....

PostingGroupDetails :
FileType | ....

PostingGroupDetails.FileType的地图为FileType.NameFileTypeDetails.FileTypeId映射到FileType.ID

我正在使用Fluent API结构手动执行映射,但是我遇到了这种关系映射的问题。

我虽然做多键映射可能有用,但我不确定。仍处于设计阶段,即将实施项目的界面。

关于如何使映射可用于两者的任何想法,直到我们可以将关系映射合并到一个或另一个?

EF实施:

文件类型

我知道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.FileTypeIDFileType.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

PostingGroupDetails.FileTypeFileType.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 );

任何想法都将不胜感激。重构数据库结构现在不是一个选项,但是它已经完成了。

1 个答案:

答案 0 :(得分:1)

实体框架允许数据库模型和类模型(或概念模型)之间的差异。您可以在概念模型中定义主键,这些主键在数据模型中不存在,或者甚至不被限制为唯一键。

因此,您可以(并且必须)选择要在概念模型中标记为PK的字段。您只能定义与概念模型中定义的PK的关联,并且每个实体只能有一个PK。因此,对于FileType,您必须选择IDName,然后才能定义与FileTypeDetails PostingGroupDetails的关联。对于您知道存在的其他关联,您必须编写连接查询。如在

from x in X
join y from Y on x.Name equals y.Name
select ...