c# - 在 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。在此示例中,这样做似乎并不那么简单。
我可以采取另一种解决方法 - 在第二个实体之前保存第一个实体。我宁愿不这样做。
解决方案
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 中实现继承。
推荐阅读
- c# - ASP.Net MVC ViewBag 在 View 中不起作用。ViewBag 结果是正确的
- swift - iOS 图表条形组合图表
- markdown - 单行结束保留在降价输出中?
- reporting-services - 在 SSRS 中对唯一值进行分组
- ios - Firebase iOS 通知 - Flutter
- php - 数组中的 PHP 访问对象属性
- php - Wordpress 'orderby' => 'post__in' 不工作
- angular - 路由和导航:无法访问网页上的任何其他路由
- javascript - 我的 Javascript 和 Python 代码是否因为指数或其他原因给了我不同的答案?
- python - 创建基于 NaN 映射的 1 和 0 的键列