У меня есть таблица Foos
, которая ссылается на себя. Чтобы построить Chain
, каждый Foo
в Chain
должен ссылаться на первый Foo
. Я решил проблему с необходимостью вставки Foo
, который ссылается на себя, используя HasDefaultValueSql("IDENT_CURRENT('dbo.Foos')")
.
Однако, используя этот метод, я больше не могу вставить два Foo
s, где один ссылается на другой, поскольку он имеет значение внешнего ключа по умолчанию (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();
}