c# - Entity Framework 在数据库中添加了额外的字段。并添加复合键的两个成员

标签 c# postgresql entity-framework asp.net-core entity-framework-migrations

我正在努力处理 Entity Framework 生成的复合键和额外字段。我有一个我认为很奇怪的问题。

假设我与这些类之间存在一对多关系:

文件(文件)

[Table("Dossier")]
public class Dossier
{
    [Key]
    public string Dossiernummer { get; set; }

    [Key]
    public string Dossierversie { get; set; }

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

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

    public ICollection<Artikel> Artikels { get; set; } ();

}

还有我的 artikel(文章)类:

[Table("Artikel")]
public class Artikel
{
    [Key]
    public string Artnr { get; set; }

    [Key]
    public string ArtVersie { get; set; }

    public string ArtOmschrijving { get; set; }

    public Dossier Dossier { get; set; }

    public string Dossiernummer { get; set; }

}

我正在使用迁移和代码优先方法。出于某种原因,使用迁移会在 artikel 表中创建一个 dossiernummer1 列。我不明白为什么,希望它消失。有谁知道吗?

我不想拥有的另一件事是我的 artikel 表中的第二个主键。它将文件表中的两个键都放在 artikel 表中,但我只想将 Dossiernummer 用作外键。你知道怎么改吗?

当从上下文中获取所有文件时,我也注意到了一些奇怪的事情。当我查看文件对象时,文章列表是空的,即使数据库中存在相关数据。自己初始化正常吗?

感谢您提前提供任何帮助和信息。

亲切的问候,

最佳答案

您必须使用流畅的 API 来设置关系并添加 ColumnAttribute 来排序键:

[Table("Artikel")]
public class Artikel
{
    [Key]
    [Column(Order = 1)]
    public string Artnr { get; set; }

    [Key]
    [Column(Order = 2)]
    public string ArtVersie { get; set; }

    public string ArtOmschrijving { get; set; }

    public Dossier Dossier { get; set; }

    public string Dossiernummer { get; set; }

}

[Table("Dossier")]
public class Dossier
{
    [Key]
    [Column(Order = 1)]
    public string Dossiernummer { get; set; }

    [Key]
    [Column(Order = 2)]
    public string Dossierversie { get; set; }

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

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

    public ICollection<Artikel> Artikels { get; set; }
}

在你的 dbcontext 中覆盖 OnModelCreating 方法:

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
      base.OnModelCreating(modelBuilder);


        builder.Entity<Dossier>()
               .HasMany(x => x.Artikels)
               .WithOne(a => a.Dossier)
               .HasForeignKey(a => new { a.Dossiernummer, a.Artnr });


        builder.Entity<Artikel>()
        .HasKey(x => new {x.Artnr,x.ArtVersie});

        builder.Entity<Dossier>()
        .HasKey(x => new {x.Dossiernummer,x.Dossierversie});
  }

关于c# - Entity Framework 在数据库中添加了额外的字段。并添加复合键的两个成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49454209/

相关文章:

c# - 如何在 MAUI 中显示 YT 视频?

c# - 使用 TinyInt 隐藏/显示控件?

ruby-on-rails - Rails rename_column 更改列的类型

sql - 我在 PostgreSql : number of referencing and referenced columns for foreign key disagree 中收到错误

mysql - 不安装MySqlConnector是否可以编译?

c# - Entity Framework 中的 HttpContext 数据缓存

c# - 通过 WCF 服务传递 NetworkCredential 以与 EWS API 一起使用

c# - 如何查看将哪个类作为参数传递给 Rider 中的模板?

php - 如何在我的mysql数据库中获取planet-latest.osm.bz2?

c# - Entity Framework 选择 IQueryable 抛出 "must be reducible node"