C# .NET实体框架核心2.0-代码优先-意外的表关联结果
我正在学习EF Core,在Fluent API中输入了错误的代码,在创建的数据库中解决了非常奇怪的一对一关系。让我给你一些代码和更具体的信息,我真的希望有人能解释这是怎么发生的 我在C#和1映射表中编码了3个模型。问题发生在两个模型之间C# .NET实体框架核心2.0-代码优先-意外的表关联结果,c#,database,entity-framework,C#,Database,Entity Framework,我正在学习EF Core,在Fluent API中输入了错误的代码,在创建的数据库中解决了非常奇怪的一对一关系。让我给你一些代码和更具体的信息,我真的希望有人能解释这是怎么发生的 我在C#和1映射表中编码了3个模型。问题发生在两个模型之间 public class Album { [Key] public int AlbumId { get; set; } public string BackgroundColor { get; set; } public B
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>();
}
公共类相册
{
[关键]
public int AlbumId{get;set;}
公共字符串背景颜色{get;set;}
公共布尔值IsPublic{get;set;}
公共int{get;set;}
公共摄影师{get;set;}
公共IList AlbumPictures{get;set;}=new List();
}
公共级摄影师
{
[关键]
公共int{get;set;}
[必需]
公共字符串用户名{get;set;}
[必需]
[第(6)款]
公共字符串密码{get;set;}
[必需]
公共字符串电子邮件{get;set;}
[必需]
公共日期时间注册数据{get;set;}
[必需]
公共日期时间出生日期{get;set;}
公共图书馆
更重要的是,如果你查看它们的密钥,它们看起来像是用C#编码的:
现在我不明白这是怎么可能的。我使用迁移创建了数据库
我没有在FluentApi中输入正确的外键,但图表显示了一对一的关系
在表的键中,我们可以看到它们没有关系
除此之外,我还有“摄影师”模式的IList专辑,据我的理解,这些专辑可能会有所不同,但不是一对一
我知道我在使用FluentApi时犯了一个错误,但我想从错误中吸取教训,了解这个结果是如何发生的
这是我在这里的第一篇文章,我希望我能得到一些支持/帮助
谢谢。这是一个奇怪的情况。您有效地配置了摄影师(主体)和相册(依赖)之间的一对一关联。通过在映射中使用正确的范围变量(p
和a
),可以清楚地了解这是如何发生的:
builder.Entity<Album>()
.HasOne(a => a.Photographer)
.WithMany(p => p.Albums)
.HasForeignKey(a => a.AlbumId); // i.e. this is Album.AlbumId
builder.Entity()
.HasOne(a=>a.摄影师)
.WithMany(p=>p.Albums)
.HasForeignKey(a=>a.AlbumId);//也就是说,这是Album.AlbumId
Album.AlbumId
现在是Album
s主键,它的外键是Photograph
。主键不是标识字段,因为它“借用”它的值来自拥有的摄影师。这是在关系数据库中建模1:1关联的常用方法。但对于EF,关联为1-n,并且它没有给出有关此异常的警告,这有点令人惊讶
有趣的是,它仍然有效。通过将相册添加到摄影师,您可以在摄影师
和相册
之间建立1:1的关联。相册
,EF可以保存所有内容。但是,如果您尝试添加第二个相册
,EF将遇到重复的主键异常。为什么o如果你想让AlbumId成为你的外键,你就在你的相册模型中加入了PictureRid。你能展示你的第三个模型吗?@timostevens,正如Gert解释的那样。我在我的相册中加入了PictureRid,因为我把它作为外键使用。我的第三个模型,不以任何方式交互,所以它可能导致当前的问题。@GertArnold我试图实现的目标ve(我已经这样做了)是一对多(摄影师->相册)的关系。因为这个线程打开的是,我试图理解这两个表之间当前的关系是如何发生的。这就是为什么我在数据库中显示了我的C代码和结果,但结果不匹配。
builder.Entity<Album>()
.HasOne(a => a.Photographer)
.WithMany(p => p.Albums)
.HasForeignKey(a => a.AlbumId); // i.e. this is Album.AlbumId