实体框架 - 根据ForeignKey添加对象

时间:2017-11-01 12:47:00

标签: c# wpf entity-framework design-patterns

我正在使用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]等...我认为这与此问题无关。

1 个答案:

答案 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; } 
}