EntityFramework Core 2:使用过滤列表的一对多映射

时间:2019-05-09 09:50:51

标签: asp.net-core entity-framework-core ef-core-2.2

我的实体看起来像这样:

class Parent1
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Child> Children { get; set; }
}

class Parent2
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Child> Children { get; set; }

}


class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string ParentType { get; set; }
    public int ParentId { get; set; }
}

基本上,在我的情况下,我有一个Child表,其中包含对不同类型父母的引用,但一次仅包含一个。我无法理解如何创建ModelBuilder映射来解决此问题。

当我使用entity.HasMany(d => d.Children)时,看不到使用ParentType = "Parent1"ParentId = d.Id映射它的方法

在EFCore 2.X中甚至有可能

更新1:

我有一个约束,我无法更改child_table

上的表格设计
------------------------------------------------
| Id   |  Name  | Parent_Type  |  Parent_Id    |       
------------------------------------------------
|  1   | C1     | Parent1      | 1             |
|  2   | C2     | Parent2      | 1             |
|  2   | C3     | Parent2      | 1             |
|  2   | C4     | Parent1      | 1             |
|  2   | C5     | Parent2      | 1             |
------------------------------------------------

1 个答案:

答案 0 :(得分:0)

您必须将两个父实体都添加到子实体中,并使外键可为空。

调整您的孩子模型,使其看起来像这样

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Parent1 Parent1 { get; set; }
    public int? ParentId1 { get; set; }
    public Parent2 Parent2 { get; set; }
    public int? ParentId2 { get; set; }
}

在您DbContext的{​​{1}}方法中,执行以下操作

OnModelCreating(ModelBuilder modelBuilder)

现在,您既可以拥有protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Parent1>() .HasMany(p => p.Children) .WithOne(c => c.Parent1) .HasForeignKey(c => c.ParentId1); modelBuilder.Entity<Parent2>() .HasMany(p => p.Children) .WithOne(c => c.Parent2) .HasForeignKey(c => c.ParentId2); modelBuilder.Entity<Child>(); // more configuration } Parent1,也可以同时拥有两者。通常,您的模型没有太大意义,但可以使用。也许您需要重新考虑要使用的模型设计。

您可以在EF here中找到有关如何处理关系的更多示例。