多对一关系

时间:2016-05-17 16:54:38

标签: c# entity-framework entity-framework-6

我有一个架构 Definitions ,我希望能够引用它自己。由于我需要有关引用的元数据,因此有一个名为 Associations 的耦合模式。我正在使用Entity Framework的流畅API和数据注释属性。

说明:

public class Definition
{
    [Key]
    public int Id { get; set; }
    // ...
    public virtual ICollection<Association> Associations { get; set; }
}

社团:

public class Association
{
    [Key]
    public int Id { get; set; }
    public int TypeId { get; set; }
    public int AssociatedDefinitionId { get; set; }
    public int RootDefinitionId { get; set; }

    public virtual AssociationType Type { get; set; }
    public virtual Definition AssociatedDefinition { get; set; }
    public virtual Definition RootDefinition { get; set; }
}

OnModelCreating:

modelBuilder.Entity<Association>()
    .HasRequired(p => p.AssociatedDefinition)
    .WithRequiredPrincipal();

modelBuilder.Entity<Association>()
    .HasRequired(p => p.RootDefinition)
    .WithRequiredPrincipal();

我使用MySQL作为数据库引擎。 当我尝试使用空关联集合保存定义实体时,我遇到了约束违规:

  

无法添加或更新子行:外键约束失败   (“u0228621_8”。“定义”,CONSTRAINT   “FK_Definitions_Associations_Id”FOREIGN KEY(“Id”)参考   “协会”(“Id”))

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您已经定义了您的关联类,所有关系都是&#34;必需的:必需&#34;因为WithRequiredPrincipal似乎不是你想要的。由于Associations集合(来自注释)显示为来自根定义,因此映射应来自定义,如下所示:

// Foreign key mappings included.
modelBuilder.Entity<Definition>().HasMany(d => d.Assocations)
  .WithRequired(a => a.RootDefinition).HasForeignKey(a => a.RootDefinitionId);
modelBuilder.Entity<Association>().HasRequired(a => a.AssociatedDefinition)
  .HasForeignKey(a => a.AssociatedDefinitionId);

因此Associations集合可能为空,但每个Association都需要RootDefinitionAssociatedDefinition