Entity Framework Core и самоссылающийся объект - PullRequest
1 голос
/ 20 мая 2019

У меня есть таблица 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...