Entity Framework Core и самоссылающийся объект

У меня есть стол 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();
    }

0 ответов

Другие вопросы по тегам