我正在使用EF6 +开发半企业WPF应用程序(任何版本都可以,我可以随时更新它。)
我已经有了数据库设置(来自之前的项目,它是一个MSSQL数据库),而且我显然是在做代码。由于NDA,我将使用模拟对象。
我想知道如何处理,以便EF将数据库中的Son
对象注入到由外键标记的Man
对象中。
e.g:
[Table("Man")]
public class Man : ObservableObject
{
private int _id;
private int _sonId;
private Son _son;
public int Id
{
get => _id;
set => Set(() => Id, ref _id, value);
}
[ForeignKey("SonId")]
public Son Son
{
get => _son;
set => Set(() => Son, ref _son, value);
}
public int SonId
{
get => _sonId;
set => Set(() => SonId, ref _sonId, value);
}
}
[Table("Son")]
public class Son : ObservableObject
{
private int _id;
public int Id
{
get => _id;
set => Set(() => Id, ref _id, value);
}
}
我正确地从数据库中检索(使用它们各自的存储库)对象,但是未映射外键对象(Son
)(它为空)。这不是EF中的一个选项,或者我做错了什么?
存储库
public async Task<IEnumerable<Man>> GetAll()
{
using (var ctx = new DatabaseContext())
{
return await ctx.Men.ToListAsync();
}
}
我没有使用任何[Key]
注释,因为我假设EF将Id字段作为主键关联,因为我的表PK是Id
,并且我在其他类中有一些验证,例如{{1} }和[StringLength]
等...我认为这与此问题无关。
答案 0 :(得分:1)
使用EF6,您可以使用Include来加载您的子对象。我不知道如何在没有链接包含的情况下加载多个孩子。您可以创建一个扩展方法来加载所有子项,如here所示。另请注意,EF Core会有一些变化。
顺便说一句,如果你不改变支持领域,你的课程可以简化:public class Man : ObservableObject // ToTable Man by default
{
public int Id { get; set; } //PK by convention
public int SonId { get; set; } // FK by convention
public Son Son { get; set; }
}