代码之家  ›  专栏  ›  技术社区  ›  Brian Mains

代码优先CTP:多个PKS或FK

  •  1
  • Brian Mains  · 技术社区  · 15 年前

    在某些情况下,我们可能有重复的pk/fk引用,因此实体A和实体B处于pk/fk关系中,但是3次。因此,实体A将有3个FK集合,实体B将有3个实体引用。如何使用代码优先模板?您是否遵循实体框架模型/数据库优先方法(EntityA、EntityA1等)的命名约定,并且它知道如何连接这些关系,或者是否有额外的步骤,或者什么?

    谢谢。

    1 回复  |  直到 15 年前
        1
  •  2
  •   ckal    15 年前

    如果你这样定义你的类

    public class EntityA
    {
        public int EntityAId { get; set; }
        public virtual EntityB EntityB1 { get; set; }
        public virtual EntityB EntityB2 { get; set; }
        public virtual EntityB EntityB3 { get; set; }
    }
    
    public class EntityB
    {
        public int EntityBId { get; set; }
        public string Name { get; set; }
    }
    

    ef代码首先将创建两个表(entityas、entitybs)。通过对流,entityas表将具有entityaid的主键和链接到entityb的三个外键(entityb1_entitybid、entityb2_entitybid、entityb3_entitybid)。

    但是,您可以通过添加外键的属性和添加与导航属性上的标记相关的属性来覆盖此对流。

    例如:

    public class EntityA
    {
        public int EntityAId { get; set; }
        public int MySpecialFkName { get; set; }
        [RelatedTo(ForeignKey = "MySpecialFkName")]
        public EntityB EntityB1 { get; set; }
    }
    

    如果您不希望POCO类中的相关元数据,可以在onModelCreating方法中定义关系。

    modelBuilder.Entity<EntityA>().HasRequired(p => p.EntityB1)
                .HasConstraint((fk, pk) => fk.MySpecialFkName == pk.EntityBId);