首页 > 解决方案 > 在 Entity Framework Core 中为没有显式外键的表添加自定义导航属性

问题描述

我有 2 个独立的模型,它们在逻辑上是一对多的,但没有明确的外键关系。

Table1 与 Table2 一对多

型号如下:

public class Table1
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}
}

public class Table2
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}
    public string RelatedTableName {get; set;}
    public string? RelatedTableId {get; set;}
}

Table2 暂时将“Table1”和“10”分别作为 RelatedTableName 和 RelatedTableId。将来,可能会有一个 Table3 也以同样的方式与 Table2 一对多。

有什么方法可以使用流畅的 API 或其他任何方法让 EF 理解这种关系?

我问的原因是因为 Table1 中的记录与 Table2 中的记录同时创建。通常,为了关联这些记录,您可以将它们添加到彼此的导航属性中,因为尚未生成 Table1 的 Id。在此示例中,这样做似乎并不那么简单。

我可以采取另一种解决方法 - 在第二个实体之前保存第一个实体。我宁愿不这样做。

标签: c#sql-server.net-coreentity-framework-core

解决方案


EF 本质上是 C# 模型和 DB Schema 之间的映射。您要求的内容无法在数据库中完成(单个列可以是多个表的外键)。如果底层数据库不能支持这个,那么 EF 也不能支持。

我能想到两种可能的解决方法:

第一的:

public class Table2
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}

    public string RelatedTableName {get; set;}
    public int? Table1RowId {get; set;}
    public int? Table2RowId {get; set;}
    // ...
    public int? Table10RowId {get; set;}
}

第二

您可以有 Table2 的子类,每个子类都有一个表的外键。请参阅此处了解如何在 EF 中实现继承。


推荐阅读