Entity framework 两个不同字段上的导航属性映射
我有一个不规则的情况,在某些关系中,表Entity framework 两个不同字段上的导航属性映射,entity-framework,fluent,Entity Framework,Fluent,我有一个不规则的情况,在某些关系中,表ID字段用作键引用。但在其他较旧的实现中,Name字段用作关系映射 FileType: ID | Name |.... FileTypeDetails: ID | FileTypeId | .... PostingGroupDetails : FileType | .... PostingGroupDetails.FileType具有到FileType.Name的映射FileTypeDetails.FileTypeId映射到FileType.ID 我正
ID
字段用作键引用。但在其他较旧的实现中,Name
字段用作关系映射
FileType:
ID | Name |....
FileTypeDetails:
ID | FileTypeId | ....
PostingGroupDetails :
FileType | ....
PostingGroupDetails.FileType
具有到FileType.Name
的映射FileTypeDetails.FileTypeId
映射到FileType.ID
我正在使用fluentapi结构手动进行映射,但是在这种关系映射中遇到了麻烦
FileType:
ID | Name |....
FileTypeDetails:
ID | FileTypeId | ....
PostingGroupDetails :
FileType | ....
我认为进行多键映射可能有效,但我不确定。仍处于设计阶段,即将实施项目的接口端
在我们能够将关系映射整合到一个或另一个之前,我如何使映射对双方都可用
环境足迹实施:
档案类型
我知道FileType
目前是可选的,但它只是与表设计直接相关。我将其标记为模式更新,目前在实践中,它是提交条目所必需的字段
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 );
文件名
filename.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 );
任何想法都将不胜感激。重构数据库结构目前不是一个选项,但它已经在计划中了。实体框架允许数据库模型和类模型(或概念模型)之间存在差异。您可以在概念模型中定义在数据模型中不存在或甚至不被约束为唯一的主键 因此,您可以(并且必须)选择要在概念模型中将哪些字段标记为PK。您只能定义与概念模型中定义的PK的关联,并且每个实体只能有一个PK。因此,对于
FileType
,您必须选择ID
或Name
,然后您可以定义与FileTypeDetails
或PostingGroupDetails
的关联。对于已知存在的其他关联,必须编写联接查询。如
from x in X
join y from Y on x.Name equals y.Name
select ...
旧表(如PostingGroupDetails)是否有主键?不一定。我正处于redev阶段,所以将来我会好好做的。但现在我必须使用现有的设计模式进行设计,同时还要准备“适当”的设计模式。它们都有标识字段,但没有一致地将它们声明为PK。虽然
FileType.Name
字段引用是唯一的,但是没有声明UK索引。您必须选择要在类模型中将哪些字段标记为PK。您只能定义EF已知的PK关联,每个实体只能有一个PK。因此,对于FileType
,您必须选择ID
或Name
,然后您可以定义与FileTypeDetails
或PostingGroupDetails
的关联。对于您知道存在的其他关联,您必须编写连接查询。因此,请硬映射转到PK的关联。对于其他属性,不定义导航属性,而是使用LINQ框架按名称获取它。我想这就是你说的?类似于Entity.Where(ft=>ft.Name==Name)
?是的,基本上就是这样,或者从y到x连接y。Name等于y.Name
。