如何配置一对一关系以使外键也成为主键?
How can I configure a one to one relationship to have the foreign key also be a primary key?
我正在尝试建立这样的关系模型:
public class MyContainer {
public int Id {get;set;}
}
public class MyCompontentOne
{
public MyContainer MyContainer {get;set;}
public string Prop1{get;set;}
}
我想配置它以获得这样的 table:
MyContainerId (FK & PK) | Prop1 |... other props
我已经使用 Fluent API 尝试了很多东西,但无论我做什么,我总是会遇到一些错误。这是我最近尝试过的:(添加阴影 属性 并使其成为外键)
mb.Entity<MyCompontentOne>().Property<int>("MyContainerId").IsRequired();
mb.Entity<MyCompontentOne>().Property(o => o.Prop1).IsRequired();
mb.Entity<MyCompontentOne>()
.HasOne(o => o.MyContainer)
.WithOne();
mb.Entity<MyCompontentOne>().HasKey("MyContainerId");
正如我在对建议的重复问题 的回答中提到的,共享 PK 关联(具有 PK 的依赖实体也是 FK)是一对一或零必需关系的默认 EF Core 映射。
虽然你的问题的具体内容(并阻止直接将答案应用于相关 post)是依赖实体中缺少明确的 属性 映射为 PK/FK.所以你问的是可能的,但需要处理 shadow properties.
以下是最小的流畅配置,它将配置 MyContainer
(主体)和 MyCompontentOne
(从属)之间的一对一或零关系,具有 (1) 导航 属性 MyContainer
在 MyCompontentOne
中,(2) 在 MyContainer
中没有导航 属性,并且 (3) 在 MyContainerId
中需要阴影 FK 属性(和列) MyCompontentOne
。然后(4)将阴影属性映射为PK:
modelBuilder.Entity<MyCompontentOne>()
.HasOne(e => e.MyContainer) // (1)
.WithOne() // (2)
.HasForeignKey<MyCompontentOne>("MyContainerId") // (3)
.IsRequired();
modelBuilder.Entity<MyCompontentOne>()
.HasKey("MyContainerId"); // (4)
我正在尝试建立这样的关系模型:
public class MyContainer {
public int Id {get;set;}
}
public class MyCompontentOne
{
public MyContainer MyContainer {get;set;}
public string Prop1{get;set;}
}
我想配置它以获得这样的 table:
MyContainerId (FK & PK) | Prop1 |... other props
我已经使用 Fluent API 尝试了很多东西,但无论我做什么,我总是会遇到一些错误。这是我最近尝试过的:(添加阴影 属性 并使其成为外键)
mb.Entity<MyCompontentOne>().Property<int>("MyContainerId").IsRequired();
mb.Entity<MyCompontentOne>().Property(o => o.Prop1).IsRequired();
mb.Entity<MyCompontentOne>()
.HasOne(o => o.MyContainer)
.WithOne();
mb.Entity<MyCompontentOne>().HasKey("MyContainerId");
正如我在对建议的重复问题
虽然你的问题的具体内容(并阻止直接将答案应用于相关 post)是依赖实体中缺少明确的 属性 映射为 PK/FK.所以你问的是可能的,但需要处理 shadow properties.
以下是最小的流畅配置,它将配置 MyContainer
(主体)和 MyCompontentOne
(从属)之间的一对一或零关系,具有 (1) 导航 属性 MyContainer
在 MyCompontentOne
中,(2) 在 MyContainer
中没有导航 属性,并且 (3) 在 MyContainerId
中需要阴影 FK 属性(和列) MyCompontentOne
。然后(4)将阴影属性映射为PK:
modelBuilder.Entity<MyCompontentOne>()
.HasOne(e => e.MyContainer) // (1)
.WithOne() // (2)
.HasForeignKey<MyCompontentOne>("MyContainerId") // (3)
.IsRequired();
modelBuilder.Entity<MyCompontentOne>()
.HasKey("MyContainerId"); // (4)