实体框架在数据库中添加额外字段。并添加复合键的两个成员

时间:2018-03-23 16:22:07

标签: c# postgresql entity-framework asp.net-core ef-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作为外键。你知道怎么改变吗?

当从上下文中获取所有档案时,我发现一些奇怪的东西。当我查看档案对象时,artikels列表为空,即使数据库中存在数据。你必须自己初始化吗?

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

亲切的问候,

2 个答案:

答案 0 :(得分:0)

您必须使用流畅的API设置关系,并将consumes: - application/json produces: - application/json 添加到订单键:

ColumnAttribute

在dbcontext覆盖[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; } } 方法中:

OnModelCreating

答案 1 :(得分:0)

Dossiernummer1: Artikel有一个档案。 EF知道必须建立K关系。这要求档案的PK必须包含在Artikel中并想要添加它。它发现你已经放入了一个具有该名称的字段(它不知道什么),所以它将它添加为Dossiernummer1。你不应该把Dossiernummer添加到Artikel - 除非你真的需要一个用于别的东西 - 因为它是FK的唯一原因。 EF将为您解决这个问题。

向Artikel添加Dossierversie: 它认为Dossier的PK是Dossiernummer + Dossierversie,所以指向正确的档案它必须同时拥有两个。我不使用代码优先,所以我不能告诉你a)如何指定一个PK和另一个单独的索引(我假设你想要的)与复合PK(你看起来像是这样)。

Dossier.Artikels是空的:这就是EF的工作方式,称为延迟加载。它首先得到的是“根”对象,而不是它们拥有的任何东西。一旦您的代码访问Artikels集合,它应该在那时加载它们(对于该档案)。这可以防止EF拉入数据库的大部分成像电子商务系统。获取客户列表将提取与该列表中的cutomer相关的所有订单;这些订单拥有的所有订单行;所有与这些订单行上的产品相关的产品数据等。这不是一件好事。相反,它只是获取您特别提到的内容,然后根据需要提取相关项目。

顺便提一下,当将未加载的集合看作是所有者的属性时(例如,在加载的Dossier上查看Artikels),VS中的调试器告诉我检查集合将导致它被加载并给我选项继续与否。