EF映射一对多

时间:2015-10-06 17:24:47

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

我想弄清楚如何映射以下关系:

  • “Relation”实体需要“Node”和“RelatedNode”。

  • Node实体有一个“Relations”(HasMany)集合,其中Node必须是Relation.Node或Relation.RelatedNode。

当前映射产生的表格如下所示:

[Id],[NodeId],[RelatedNodeId],[RelationType],[Node_Id]

[Node_Id] 正在自动创建,这正是我想要避免的。

关系实体:

public class Relation
{
    private Relation()
    {

    }

    public Relation(int nodeId, int relatedNodeId)
    {
        NodeId = nodeId;
        RelatedNodeId = relatedNodeId;
    }

    public Relation(Node node, Node relatedNode)
    {
        Node = node;
        RelatedNode = relatedNode;
    }

    public int Id { get; set; }

    public int NodeId { get; set; }

    public Node Node { get; set; }

    public int RelatedNodeId { get; set; }

    public Node RelatedNode { get; set; }

    public RelationType RelationType { get; set; }
}

流利-API:

// Relation
modelBuilder.Entity<Relation>().Map(m =>
{
    m.ToTable("Relations");
});
modelBuilder.Entity<Relation>()
    .HasKey(t => t.Id)
    .Property(t => t.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Relation>().HasRequired(t => t.Node).
    WithMany().HasForeignKey(t => t.NodeId).WillCascadeOnDelete(false);
modelBuilder.Entity<Relation>().HasRequired(t => t.RelatedNode).
    WithMany().HasForeignKey(t => t.RelatedNodeId).WillCascadeOnDelete(false);


// Node
modelBuilder.Entity<Node>().Map(m =>
{
    m.MapInheritedProperties();
    m.ToTable("Nodes");
});
modelBuilder.Entity<Node>().HasMany(t => t.Relations);

1 个答案:

答案 0 :(得分:0)

删除此行

modelBuilder.Entity<Node>().HasMany(t => t.Relations);

您已经在上面指定了这种关系。

实体框架正在添加该列以表示从Relation到Node的关系。由于您为“Node”和“RelatedNode”指定了HasForeignKey,因此它会创建“NodeId”和“RelatedNodeId”列(正如您所期望的那样)。

“Node_Id”列是EF在需要尚未指定的FK时生成的列。因此,在EF的某个地方被告知存在从节点到关系的关系,并且没有指定FK(EG删除了行)