我目前正在清理一個相當大的數據庫。數據庫的一部分具有一對一或零映射的關係。特別:

User -> UserSettings

並非所有用戶都有用戶設置,但沒有用戶就不能存在用戶設置。不幸的是,這些表已經存在。 User有PK ID。 UserSettings有一個PK ID和一個列User_Id_Fk ,此時,它不是真正的FK(沒有定義關係)。

我正在修復它,並且已經通過SQL從數據庫角度完成了這一過程,並通過測試確認。 (添加了FK約束。在User_Id_Fk上添加了一個唯一約束。)這都是在UserSettings表上完成的。 (注意:我這裡沒有使用EF遷移。我必須在此時手動編寫SQL。)

但是,我現在需要連接現有應用程序以正確處理這個新映射。該應用程序使用ASP.NET Core 1.0和EF7。以下是現有數據模型的(縮短版)。

public class User
{
  public int Id { get; set; }

  public virtual UserSettings UserSettings { get; set; }
}

public class UserSettings
{
  public int Id { get; set; }

  [Column("User_Id_Fk")]
  public int UserId { get; set; }

  [ForeignKey("UserId")]
  public virtual User User { get; set; }
}

我也有這個Fluent Mapping:

builder.Entity<UserSettings>()
            .HasOne(us => us.User)
            .WithOne(u => u.User)
            .IsRequired(false);

當我去運行應用程序並訪問數據庫中的這些項目時,我收到此錯誤,然後是一組神秘的消息,其中沒有任何信息直接與我的應用程序相關:

ArgumentNullException: Value cannot be null.
Parameter name: navigation
Microsoft.Data.Entity.Utilities.Check.NotNull[T] (Microsoft.Data.Entity.Utilities.T value, System.String parameterName) <0x10d28a650 + 0x00081> in <filename unknown>, line 0

經過研究,有人提到UserSettings類的ID必須與外鍵相同,如下所示:

public class UserSettings
{
  [Key, ForeignKey("User")]
  public int Id { get; set; }

  public virtual User User { get; set; }
}

我沒有把它作為一個選項,因為DB正用於我此時無法控制的其他應用程序。那麼,我被困在這裡了嗎?我是否只需要保持1:多的映射(現在可能會發生,雖然它沒有)並且對1:0..1映射沒有適當的約束?

更新看下面的octavioccl答案,我試了一下但沒有成功。但是,我隨後從UserSettings的映射中刪除了User (但我離開了UserId )。就我所知,一切似乎都有效。我真的很困惑這裡發生的事情,如果這是正確的答案,或者我只是幸運。

熱門答案

刪除數據註釋並嘗試使用以下配置:

builder.Entity<UserSettings>()
            .Property(b => b.UserId)
            .HasColumnName("User_Id_Fk");

builder.Entity<User>()
            .HasOne(us => us.UserSettings)
            .WithOne(u => u.User)
            .HasForeignKey<UserSettings>(b => b.UserId);

EF Core文檔

配置外鍵時,需要指定依賴實體類型 - 請注意上面列表中提供給HasForeignKey的泛型參數。在一對多關係中,很明顯具有引用導航的實體是依賴的,而具有集合的實體是主體。但在一對一的關係中並非如此 - 因此需要明確定義它。

引用鏈接Blog - BlogImage )中顯示的示例與您要實現的內容幾乎相同。

如果我上面顯示的解決方案不起作用,那麼您應該檢查User_Id_Fk列是否允許為null 。如果是這種情況,請將FK屬性類型更改為int?

public class UserSettings
{
  public int Id { get; set; }

  public int? UserId { get; set; }

  public virtual User User { get; set; }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因