gpt4 book ai didi

c# - .NET Entity Framework Core 2.0 - 代码优先 - 意外的表关系结果

转载 作者:搜寻专家 更新时间:2023-10-30 20:34:41 25 4
gpt4 key购买 nike

我正在学习 EF Core 并在 Fluent API 中放置了错误的代码,这导致创建的数据库中出现了非常奇怪的一对一关系。让我给你一些代码和更具体的信息,我真的希望有人能解释这是怎么发生的。

我用 C# 编写了 3 个模型和 1 个映射表。问题发生在两个模型之间。

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 中的部分表关系(仅包括 Album 和 Photographer 之间“奇怪”关系的关系):

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

如您所见,我没有将“PhotographerId”作为外键,而是将“AlbumId”置于“自引用”表中,对吧?

但这看起来不是真的,因为当我查看数据库图表时,我看到以下内容:

Diagram (Relation between Album and Photographer)

更多的是,如果您查看他们拥有的 key ,他们看起来像是用 C# 编码的:

Tables Keys

现在我不明白这是怎么可能的。我使用迁移创建了数据库。

  1. 我没有在 FluentApi 中放置正确的外键,但图表显示一对一关系?
  2. 在表的Keys中,我们可以看到他们没有Relationship。
  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 并且它没有给出有关此异常的警告有点令人惊讶。

有趣的是它仍然有效。您可以通过将相册添加到 Photographer.Albums 来建立 PhotographerAlbum 之间的 1:1 关联,并且 EF 会保存所有内容。但是,如果您尝试添加第二个 Album,EF 将遇到重复主键异常。

关于c# - .NET Entity Framework Core 2.0 - 代码优先 - 意外的表关系结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46927981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com