![](/img/trans.png)
[英]Entity framework core multipleDbContext code-first migration of shared entity
[英].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# 編碼的:
現在我不明白這怎么可能。 我使用遷移創建了數據庫。
我知道我在 FluentApi 上犯了一個錯誤,但我想從我的錯誤中吸取教訓並了解這個結果是如何發生的。
這是我在這里的第一篇文章,我希望我能得到一些支持/幫助。
謝謝你。
這是一個奇怪的情況。 您有效地配置了Photographer
(主要)和Album
(從屬)之間的一對一關聯。 通過在映射中使用正確的范圍變量( p
和a
),這是如何發生的變得很清楚:
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
來建立Photographer
和Album
之間的 1:1 關聯,EF 保存一切正常。 但是,如果您嘗試添加第二個Album
,EF 將遇到重復的主鍵異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.