EF映射一到多

本文关键字:映射 EF | 更新日期: 2023-09-27 18:16:39

我正在试图找出如何映射以下关系:

  • "Relation"实体需要一个"Node"和一个"RelatedNode"

  • 节点实体有一个"关系"(HasMany)集合,其中节点被要求是关系。Node OR 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; }
}

fluent 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);

EF映射一到多

删除这一行

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

你已经在上面指定了这个关系。


Entity Framework正在添加该列来表示从Relation到Node的关系。由于您为"Node"answers"RelatedNode"指定了HasForeignKey,因此它将创建"NodeId"answers"RelatedNodeId"列(如您所期望的那样)。

"Node_Id"列是EF在需要未指定的FK时生成的。因此,某处EF被告知存在从Node到Relation的关系,而FK没有被指定(例如删除行)