【问题标题】:EF Mapping One To ManyEF 一对多映射
【发布时间】:2015-10-06 17:24:47
【问题描述】:

我正在试图弄清楚如何映射以下关系:

  • “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; }
}

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

【问题讨论】:

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


    【解决方案1】:

    删除这一行

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

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


    Entity Framework 正在添加该列来表示从关系到节点的关系。由于您为“Node”和“RelatedNode”指定了 HasForeignKey,因此它会创建“NodeId”和“RelatedNodeId”列(如您所愿)。

    “Node_Id”列是 EF 在需要未指定的 FK 时生成的内容。因此,某处 EF 被告知存在从 Node 到 Relation 的关系,并且未指定 FK(EG 删除了该行)

    【讨论】:

    • 我已将其删除。创建的 DB 模式仍然具有 [Node_Id](不需要),以及所需的 [NodeId] 和 [RelatedNodeId])。
    • 嗯,这应该是原因。你是如何生成模式的?当我使用 CodeFirst 迁移时,我总是忘记使用 -force,有时我的更改不会反映。
    • 我只是将数据库整体删除,然后运行。我已禁用代码优先迁移。
    • 嗯。 Node 继承自什么? IE MapInheritedProperties 会影响这个吗?
    • Node 确实有一个继承自的 BaseClass!这里有什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2018-07-03
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多