簡體   English   中英

在 EF6 中使用 PK 而不是 FK 創建可選-可選關系

[英]Create optional-optional relationship in EF6 with PK instead of FK

是否可以根據表的 PK 創建一個自動填充我的導航屬性的映射? 這意味着我不想在任何桌子上都有 FK。 我知道當有 Optional -> Required 映射時這是可能的。 AFAIK 在 SQL 服務器上沒有創建任何約束,EF6 在運行時“模擬”了這種關系。

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

所以代碼_dbContext.Cars.Include(x => x.Driver).First(x => x.Id == 1); 如果存在,將返回帶有驅動程序的汽車,如果不存在,則返回 null 驅動程序。

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 不對插入或刪除執行任何驗證...這是一個錯誤嗎? 好吧,至少它適用於我的情況。

據我了解,您希望 Car 和 Driver 之間存在一對一的關系,即每輛 Car 可以有零個或一個驅動程序。 如果是這樣,您需要將 Driver 的主鍵定義為 Car 實體的外鍵。 你試過這個

class Driver
{
   [ForeignKey("Car")]
   public int Id { get; set; }
   public virtual Car Car { get; set; }
}

這樣,只有一個 Car 記錄將只有一個 Driver 記錄同時引用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM