EF6 - 如何确定 NavigationProperty 的 principal/dependent 面

EF6 - How to determine principal/dependent sides from a NavigationProperty

我正在整合一个使用已编译程序集的进程,查找 DbContext,并为 context 和各种实体 类 编写代码优先文件。它是 larger project.

的一部分

事情进展顺利,但我 运行 陷入困境,试图发现,对于关联,哪一端是主要的,哪一端是从属的。这只是 0-1..0-1 和 1..1 基数中的一个问题,因为其他的可以根据每一端的重数来确定。

不过,在这两种情况下,很明显 EF6 知道哪个是哪个,因为它们必须在源中声明。例如:

public class FooMap : EntityTypeConfiguration<Foo>
{
   public FooMap()
   {
      HasKey(t => t.Id);
      ToTable("Foos");
      HasRequired(t => t.BarObj).WithRequiredPrincipal(t => t.FooObj);
   }
}

我从 CSpace 或 OSpace EntityType(按此顺序,取决于哪个不为空)开始,并使其 DeclaredNavigationProperties 属性 循环关联.

我要寻找什么才能找到 principal/dependent 名称?不能使用 GetDependentProperties() 来查看它是否 return 是空的,因为如果 DeclaringType 是主体并且没有任何用户,它都会 return 空定义的外键属性(即 FK 的所有影子属性)。

感谢您的任何见解。

好吧,这是我迄今为止 post 回答过的所有问题中最短的 运行 :-)

经过一闪而过的洞察力和对 dotPeek 的一些挖掘之后,我相信我已经找到了我正在寻找的答案。

NavigationProperty 对象开始:

   AssociationType associationType = (AssociationType) navigationProperty.RelationshipType;
   ReferentialConstraint constraint = associationType.Constraint;
   AssociationEndMember principalEnd = (AssociationEndMember) constraint.FromRole;
   AssociationEndMember dependentEnd = (AssociationEndMember) constraint.ToRole;
   EntityType principalType = principalEnd.GetEntityType();
   EntityType dependentType = dependentEnd.GetEntityType();

请注意,这当然可以收紧,但我想我 post 出于教育目的我会把它分开。