我有一个引用自己的表Foos
。要构建Chain
,Foo
中的每个Chain
必须引用第一个Foo
。我解决了我需要能够插入使用Foo
引用自己的HasDefaultValueSql("IDENT_CURRENT('dbo.Foos')")
的问题。
但是,使用此方法,我无法再插入两个Foo
,其中一个引用另一个,因为它具有默认外键值(0
),并且Entity Framework认为它应该使用默认值而不是生成外键,使其与我要插入的对象图相匹配。
这是我的代码:
public class Foo
{
public int Id { get; set; }
public int OriginId { get; set; }
public Foo Origin { get; set; }
public ICollection<Foo> Chain { get; set; }
}
public class Database : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Database=EfCoreSelfReferencingTest");
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Foo>()
.HasOne(f => f.Origin)
.WithMany(f => f.Chain)
.HasForeignKey(f => f.OriginId)
.OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<Foo>()
.Property(f => f.OriginId)
.HasDefaultValueSql("IDENT_CURRENT('dbo.Foos')");
base.OnModelCreating(modelBuilder);
}
public DbSet<Foo> Foos { get; set; }
}
var foo1 = new Foo { }; // Will have OriginId set to 1
var foo2 = new Foo { Origin = foo1 }; // Will have OriginId set to 2, although I need it to be 1
using (var context = new Database())
{
context.Foos.Add(foo1);
context.Foos.Add(foo2);
context.SaveChanges();
}