Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET实体框架核心2.0-代码优先-意外的表关联结果_C#_Database_Entity Framework - Fatal编程技术网

C# .NET实体框架核心2.0-代码优先-意外的表关联结果

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

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

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

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