using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
public class TestContext : DbContext
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseInMemoryDatabase(databaseName: "TestDb");
protected override void OnModelCreating(ModelBuilder modelBuilder){
modelBuilder.Entity<LineItem>()
.HasOne(li => li.OriginLineItemContainer1)
.WithMany(li => li.NextContainer2LineItems)
.HasForeignKey(li => li.OriginLineItemContainer1Id);
modelBuilder.Entity<LineItem>()
.HasOne(li => li.OriginLineItemContainer2)
.WithMany(li => li.NextContainer3LineItems)
.HasForeignKey(li => li.OriginLineItemContainer2Id);
modelBuilder.Entity<BaseContainer>()
.HasDiscriminator(bc => bc.Discriminator)
.HasValue<Container1>("Container1")
.HasValue<Container2>("Container2")
.HasValue<Container3>("Container3");
modelBuilder.Entity<BaseContainer>()
.HasMany(bc => bc.LineItems)
public abstract class BaseContainer
public int Id {get; set;}
public List<LineItem> LineItems = new();
public string Discriminator {get; set;}
public class Container1 : BaseContainer
Discriminator = "Container1";
public class Container2 : BaseContainer
Discriminator = "Container2";
public class Container3 : BaseContainer
Discriminator = "Container3";
public int Id {get; set;}
public LineItem OriginLineItemContainer1 {get;set;}
public int? OriginLineItemContainer1Id {get; set;}
public List<LineItem> NextContainer2LineItems {get; set;} = new();
public LineItem OriginLineItemContainer2 {get; set;}
public int? OriginLineItemContainer2Id {get; set;}
public List<LineItem> NextContainer3LineItems {get; set;} = new();
public static void Main()
var setupContext = new TestContext();
var container1 = new Container1();
var container1LineItem = new LineItem();
var container2 = new Container2();
var container2LineItem = new LineItem();
container2LineItem.OriginLineItemContainer1 = container1LineItem;
var container3 = new Container3();
var container3LineItem = new LineItem();
container3LineItem.OriginLineItemContainer2 = container2LineItem;
container3LineItem.OriginLineItemContainer1 = container1LineItem;
container1.LineItems.Add(container1LineItem);
container2.LineItems.Add(container2LineItem);
container3.LineItems.Add(container3LineItem);
setupContext.Add(container1);
setupContext.Add(container2);
setupContext.Add(container3);
setupContext.SaveChanges();
var validationContext = new TestContext();
var validationContainer1 = validationContext.Set<Container1>().Include(c => c.LineItems).Single();
var validationContainer2 = validationContext.Set<Container2>().Include(c => c.LineItems).Single();
var validationContainer3 = validationContext.Set<Container3>().Include(c => c.LineItems).Single();
Assert.That(validationContainer1.LineItems[0].NextContainer2LineItems.Count, Is.EqualTo(1));
Assert.That(validationContainer2.LineItems[0].NextContainer3LineItems.Count, Is.EqualTo(1));