我正在努力使用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列表为空,即使数据库中存在数据。你必须自己初始化吗?
提前感谢您提供任何帮助和信息。
亲切的问候,
答案 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中的调试器告诉我检查集合将导致它被加载并给我选项继续与否。