EF Core 播种机制不适用于关系

thm*_*spl 4 c# entity-framework entity-framework-core

我试图简单地使用 EF core 3 为两个表添加种子,但它不起作用。这是一个很小的操作,但 EF 似乎无法做到这一点。

对象模型

public class Object
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        [ForeignKey("Building")]
        public int BuildingId { get; set; }

        public Building Building { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

建筑模型

public class Building
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public string Name { get; set; }

        public virtual List<Object> Objects { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

上下文类

public class AppDatabaseContext : DbContext
    {
        private static readonly DbContextOptions options = new DbContextOptionsBuilder<AppDatabaseContext>().UseInMemoryDatabase("INMEM-DB").EnableSensitiveDataLogging().Options;

        public AppDatabaseContext() : base(options)
        {

        }

        public DbSet<Building> Buildings { get; set; }

        public DbSet<Object> Objects { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Object>().HasOne(i => i.Building).WithMany(b => b.Objects);
            modelBuilder.Entity<Building>().HasMany(b => b.Objects).WithOne(i => i.Building);*/


            Building testBuilding = new Building()
            {
                Id = 1,
                Name = "Test Building"
            };

            modelBuilder.Entity<Building>(b =>
            {
                b.HasData(testBuilding);
            });


            modelBuilder.Entity<Object>(o =>
            {
                o.HasData(new Object()
                {
                    Id = 1,
                    Name = "Test Object",
                    Building = testBuilding,
                });
            });
        }
    }
Run Code Online (Sandbox Code Playgroud)

错误信息

System.InvalidOperationException:“无法添加键值为“Id:1”的实体类型“Object”的种子实体,因为它设置了导航“Building”。要种子关系,您需要将相关实体种子添加到“Building”并指定外键值 {'BuildingId'}。

为什么它不起作用?请帮我。我打算扔掉这整个废话并用 Java 重写它(这会快得多)。

Dav*_*oft 5

正如错误所示:“要建立关系种子,您需要将相关实体种子添加到‘建筑物’并指定外键值”

在 EF 中,您同时拥有“外键属性”和“导航属性”。对于大多数操作,您可以使用其中之一,但EF Core 数据播种要求您直接设置外键属性。

   modelBuilder.Entity<Object>(o =>
    {
        o.HasData(new Object()
        {
            Id = 1,
            Name = "Test Object",
            //Building = testBuilding,
            BuildingId = 1 
        });
    });
Run Code Online (Sandbox Code Playgroud)