【问题标题】:Seeding Relational Data in Entity Framework Core在 Entity Framework Core 中播种关系数据
【发布时间】:2021-06-30 02:19:36
【问题描述】:

我在这方面找到了几篇 SO 帖子,但无法确定我在这里做错了什么。

我正在尝试为两张表分别设置一个项目。第二项包含对第一项的查找。我可以毫无问题地为父母播种,但无法弄清楚为孩子播种的正确语法。

这是我用来播种父母的代码

   modelBuilder.Entity<Group>().HasData(new Group
        {
            Id = 1,
            Name = "Any",
            IsDeleted = false
        });

这是给孩子播种的代码 - 这失败了:

 modelBuilder.Entity<ShiftTypeDb>().HasData(new 
        {
            Id = 1,
            Name = "Any",
            GroupId = 1,

            IsDeleted = false
        });

根据docs 的建议,我使用了匿名对象而不是类本身。我也尝试过同时使用导航属性以及外键和导航属性。 id=1 的 Group 肯定已经在数据库中,所以这不是父项不存在的问题。

我得到的错误信息是:

在表“shifttypes”上插入或更新违反了外键约束“fk_shifttypes_groups_groupid”

而为种子生成的SQL是

INSERT INTO shifttypes (id, groupid, isdeleted, name)
VALUES (1, 0, FALSE, 'Any');

尽管它在种子中被硬编码为“1”,但它显然插入了一个“0”作为 GroupId;我无法弄清楚为什么会这样。下面是代表这两个表的两个实体的代码:

public class Group
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsDeleted { get; set; }
    public ICollection<ApplicationUser> Users { get; set; }

    public Group()
    {
    }

    public Group(string name)
    {
        Name = name;
    }
}

public class ShiftTypeDb
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsDeleted { get; set; }
    public int GroupId { get; set; }
    public Group Group { get; set; }

    public ShiftTypeDb()
    {
    }
}

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    此代码已在 Visual Studio 中测试并正常运行。修复所有错误后,您必须删除现有数据库和迁移并使用 Add-Migration InitialCreate 选项创建新的。

    你有一对一的关系,而不是一对多。要修复该错误,请将 ShiftTypeDb 集合添加到 Group 类:

        public class Group
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool IsDeleted { get; set; }
        public virtual ICollection<ApplicationUser> Users { get; set; }
    
        public virtual ICollection<ShiftTypeDb> ShifTypeDbs { get; set; }
    
       ...other properties
    }
    

    ans 使用 ShiftTypeDb 而不是匿名类型。仅当您的类具有阴影属性时才使用匿名类型。并确保该组领先于 TypeDB

    modelBuilder.Entity<ShiftTypeDb>(
                    entity =>
                    {
                        entity.HasOne(d => d.Group)
                            .WithMany(p => p.ShiftTypeDbs)
                            .HasForeignKey("GroupId");
                    });
     
    
    modelBuilder.Entity<ShiftTypeDb>().HasData(new ShiftTypeDb 
            {
                Id = 1,
                Name = "Any",
                GroupId = 1,
                IsDeleted = false
            })
    

    【讨论】:

    • 嗨,谢尔盖,我已经完成了上述操作(将 ICollection ShiftTypes 添加到 Group 实体,FluentAPI 代码以配置关系并将匿名对象更改为 ShiftTypeDb 的对象初始化程序)但我得到了同样的错误信息。
    • 你必须再次迁移你的数据库
    • 感谢 Sergey,原来问题是我必须删除以前的迁移才能使新更改生效。最后,我能够在不将 ICollection 添加到 Group 集合的情况下使其工作。
    • 很抱歉,您只是没有正确测试它。这是一个错误。如果不添加 ICollection,您将无法添加另一个 ShiftTypeDb 记录。
    • 从我的角度来看,@Serge 的 cmets 很奇怪。理论上可以通过仅使用 FK 来添加一对多关系,而不需要实际的导航字段(塞尔推荐的集合)。见docs.microsoft.com/en-us/ef/core/modeling/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2020-05-23
    • 2016-05-14
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 2022-08-02
    相关资源
    最近更新 更多