实体框架核心和自引用实体

时间:2019-05-20 08:35:42

标签: c# entity-framework-core entity-framework-core-2.2

我有一个引用自己的表Foos。要构建ChainFoo中的每个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 个答案:

没有答案