【问题标题】:EF Core seeding mechanism isn't working with relationshipsEF Core 播种机制不适用于关系
【发布时间】:2020-02-03 14:09:52
【问题描述】:

我正在尝试使用 EF 核心 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; }
    }

建筑模型

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

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

        public virtual List<Object> Objects { get; set; }
    }

上下文类

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,
                });
            });
        }
    }

错误信息

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

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

【问题讨论】:

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


    【解决方案1】:

    正如错误所说:“要播种关系,您需要将相关实体种子添加到 'Building' 并指定外键值”

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      相关资源
      最近更新 更多