c# - 如何将子实体映射到 EF Core 中的同一个表
问题描述
我正在使用 EF Core,我需要将子实体映射到同一个表,因为它们属于同一类型。
想象一下类层次结构的以下场景:
public class Grandpa
{
public Guid Id { get; set; }
public Father Robert { get; set; }
public Father Jack { get; set; }
}
public class Father
{
public Guid Id { get; set; }
// I use this to reference Grandpa
public Guid GrandpaId { get; set; }
public List<Son> MySons { get; set; }
}
public class Son
{
public Guid Id { get; set; }
// I use this to reference Father
public Guid FatherId { get; set; }
public string Name { get; set; }
}
现在问题如下:在我的场景中(上面是复制我的真实场景的抽象),我无法制作Robert
数组Jack
- 它们需要单独存在。另一件事是,Grandpa
实体拥有 2 个Father
实体,每个Father
实体拥有一个实体列表Son
。
我想告诉模型构建器以这样一种方式生成我的表,即所有实体都有一个表,所有Father
实体都有一个表Son
- 因为它们都是相同的实体,它们永远不应该作为它们的主键放在不同的表中和外键 (ID) 清楚地表明它们属于谁。
现在,你知道,在普通的 SQL 中,很容易实现这样的结构,为此编写 SQL 代码非常简单。但是,如何使用 EF Core 做到这一点?
我试过了:
1)在模型构建器中指定所有主键和外键,每个实体 2)在模型构建器中设置拥有的属性层次结构使用
modelBuilder.Entity<Father>()
.ToTable("Fathers");
modelBuilder.Entity<Son>()
.ToTable("Sons");
modelBuilder.Entity<Grandpa>(g =>
{
x.OwnsOne(y => y.Robert, z =>
{
z.OwnsMany(a => a.MySons, b =>
{
b.HasKey(k=>k.Id);
b.ToTable("Sons");
});
z.ToTable("Fathers");
});
x.OwnsOne(y => y.Jack, z =>
{
z.OwnsMany(a => a.MySons, b =>
{
b.HasKey(k=>k.Id);
b.ToTable("Sons");
});
z.ToTable("Fathers");
});
});
但是,有错误说:
Cannot use table 'Fathers' for entity type 'Grandpa.Father#Robert' since it is being used for entity type 'Grandpa.Father#Jack' and there is no relationship between their primary keys.
我必须提到,这些实体是同一实体的一部分DbContext
——它们最好保持不变。
EF Core 映射或未能映射实体的方式是错误的 - 如果我删除表名规范,它只会为我的相同类型的实体创建单独的表,这是错误的。我什至没有在不同的命名空间中声明相同的实体/重复,但它实际上是相同的命名空间,相同的实体,Grandpa
实体有两个Father
实体,每个Father
实体都有一个List<Son>
.
解决方案
推荐阅读
- rabbitmq - 在骆驼rabbitmq中重新启动骆驼路线丢失消息
- javascript - AJAX is successfully posting variables which are not visible in $_POST
- javascript - 角度材质对话框中的透明背景
- phpstorm - PhpStorm: Can I sort properties/methods alphabetically?
- javascript - 是否可以在服务器上运行带有 HTML 的 PHP 文件
- c# - How do you make a C# server that can store its connection to clients AND update them when needed
- python - Python 我可以使用 Tkinter 打印到打印机吗
- python - Problem with KerasRegressor & multiple output
- python-3.x - Anaconda 不启动 python 程序
- c++ - 安装没有 lib 文件的 OpenCV