簡體   English   中英

.NET Entity Framework Core 2.0 - 代碼優先 - 意外的表關系結果

[英].NET Entity Framework Core 2.0 - Code-First - Unexpected Table Ralationship Result

我正在學習 EF Core 並在 Fluent API 中放置了錯誤的代碼,這在創建的數據庫中解析為非常奇怪的一對一關系。 讓我給你一些代碼和更具體的信息,我真的希望有人能解釋這是怎么發生的。

我在 C# 中編寫了 3 個模型和 1 個映射表。 問題發生在 2 個模型之間。

public class Album
{
    [Key]
    public int AlbumId { get; set; }

    public string BackgroundColor { get; set; }

    public Boolean IsPublic { get; set; }

    public int PhotographerId { get; set; }

    public Photographer Photographer { get; set; }

    public IList<PictureAlbum> AlbumPictures { get; set; } = new List<PictureAlbum>();
}

public class Photographer
{
    [Key]
    public int PhotographerId { get; set; }

    [Required]
    public string Username { get; set; }

    [Required]
    [MinLength(6)]
    public string Password { get; set; }

    [Required]
    public string Email { get; set; }

    [Required]
    public DateTime RegisteredDate { get; set; }

    [Required]
    public DateTime BirthDate { get; set; }

    public IList<Album> Albums { get; set; } = new List<Album>();
}

所以一切看起來都不錯。 “相冊”有攝影師和外鍵。 攝影師收藏了“相冊”。

以下是 Fluent API 中的部分表關系(僅包括相冊和攝影師之間“奇怪”關系的關系):

builder.Entity<Album>()
            .HasOne(p => p.Photographer)
            .WithMany(a => a.Albums)
            .HasForeignKey(p => p.AlbumId);

如您所見,我沒有將“PhotographerId”作為外鍵,而是將“AlbumId”放入“自引用”表中,對嗎?

但這看起來不正確,因為當我查看數據庫圖時,我看到以下內容:

圖(相冊與攝影師的關系)

更重要的是,如果您查看它們擁有的密鑰,它們看起來像是用 C# 編碼的:

表鍵

現在我不明白這怎么可能。 我使用遷移創建了數據庫。

  1. 我沒有在 FluentApi 中放置正確的外鍵,但圖中顯示了一對一的關系?
  2. 在表的鍵中,我們可以看到它們沒有關系。
  3. 更重要的是,我在“攝影師”模型中有 IList 相冊,據我所知,這應該會導致不同的東西,但不是一對一。

我知道我在 FluentApi 上犯了一個錯誤,但我想從我的錯誤中吸取教訓並了解這個結果是如何發生的。

這是我在這里的第一篇文章,我希望我能得到一些支持/幫助。

謝謝你。

這是一個奇怪的情況。 您有效地配置了Photographer (主要)和Album (從屬)之間的一對一關聯。 通過在映射中使用正確的范圍變量( pa ),這是如何發生的變得很清楚:

builder.Entity<Album>()
        .HasOne(a => a.Photographer)
        .WithMany(p => p.Albums)
        .HasForeignKey(a => a.AlbumId); // i.e. this is Album.AlbumId

Album.AlbumId現在是Album的主鍵它對Photographer外鍵。 主鍵是沒有標識字段,因為它“借用”從擁有它的價值Photographer 這是在關系數據庫中對 1:1 關聯進行建模的常用方法。 但是對於 EF,關聯是 1-n 並且它沒有給出有關此異常的警告有點令人驚訝。

有趣的是它仍然有效。 您可以通過將Album添加到Photographer.Albums來建立PhotographerAlbum之間的 1:1 關聯,EF 保存一切正常。 但是,如果您嘗試添加第二個Album ,EF 將遇到重復的主鍵異常。

暫無
暫無

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

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