在 EF6 中使用 PK 而不是 FK 创建可选-可选关系

Posted

技术标签:

【中文标题】在 EF6 中使用 PK 而不是 FK 创建可选-可选关系【英文标题】:Create optional-optional relationship in EF6 with PK instead of FK 【发布时间】:2022-01-14 05:52:48 【问题描述】:

是否可以根据表的 PK 创建一个自动填充我的导航属性的映射?这意味着我不想在任何桌子上都有 FK。我知道当有 Optional -> Required 映射时这是可能的。 AFAIK 没有在 SQL Server 上创建约束,EF6 在运行时“模拟”了这种关系。

|====================|                   |====================|
|        Car         |                   |       Driver       |
|====================|                   |====================|
|         Id         |  0..1 ----- 0..1  |         Id         |
|--------------------|                   |--------------------|

所以代码_dbContext.Cars.Include(x => x.Driver).First(x => x.Id == 1); 如果存在则返回带司机的汽车,如果不存在则返回空司机。

class Car

    public int Id  get; set; 
    public virtual Driver Driver  get; set; 


class Driver

    public int Id  get; set; 
    public virtual Car Car  get; set; 

以下映射想在我的汽车中创建一个 DriverId:

class CarMapping : EntityTypeConfiguration<Car>

    public CarMapping()
    
        HasKey(x => x.Id);
    


class DriverMapping : EntityTypeConfiguration<Driver>

    public CarMapping()
    
        HasKey(x => x.Id);
        HasOptional(x => x.Car)
            .WithOptionalPrincipal(x => x.Driver);
    

编辑

我检查了前面提到的required映射:

class CarMapping : EntityTypeConfiguration<Car>

    public CarMapping()
    
        HasKey(x => x.Id);
    


class DriverMapping : EntityTypeConfiguration<Driver>

    public CarMapping()
    
        HasKey(x => x.Id);
        HasOptional(x => x.Car)
            .WithRequired(x => x.Driver);
    

而且它有效。 EF6 不对插入或删除执行任何验证...这是一个错误吗?好吧,至少它适用于我的情况。

【问题讨论】:

【参考方案1】:

据我了解,您希望 Car 和 Driver 之间存在一对一的关系,即每辆 Car 可以有零个或一个驱动程序。如果是这样,您需要将 Driver 的主键定义为 Car 实体的外键。你试过了吗

class Driver

   [ForeignKey("Car")]
   public int Id  get; set; 
   public virtual Car Car  get; set; 

这样,只有一个 Car 记录将只有一个 Driver 记录同时引用它。

【讨论】:

以上是关于在 EF6 中使用 PK 而不是 FK 创建可选-可选关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中复制表(包括 PK 和 FK)

EF 代码优先 - 配置一对零或一关系,无需共享 PK/FK

SQL Merge输出匹配和不匹配的结果

PK和FK表设计之间的混淆

如何在 Json 文件中使用 FK/PK - Pentaho

Toad ER 图未显示表之间的关系和 pk、fk