我的实体看起来像这样:
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 |
------------------------------------------------
答案 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中找到有关如何处理关系的更多示例。