提问者:小点点

在实体框架核心中植入关系数据


我已经找到了几个这样的帖子,但不能确定我在这里做错了什么。

我试着在两张桌子上各放一个项目。第二项包含对第一项的查找。我可以在没有问题的情况下为父级添加种子,但无法找到正确的语法来为子级添加种子。

下面是我用来种子父级的代码

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

根据文档的建议,我使用了一个匿名对象,而不是类本身。我也尝试过同时使用navigation属性、外键和nav道具。ID=1的组肯定已经在db中了,所以这不是父项不存在的问题。

我得到的错误消息是:

表“ShiftTypes”上的Insert或update违反外键约束“FK_ShiftTypes_GROUPS_GROUPID”

并且为种子生成的SQL是

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

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

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()
    {
    }
}

共1个答案

匿名用户

将ShiftTypeDb集合添加到组:

    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 ICollection<ShiftTypeDb> ShiftTypeDbs { get; set; }

   ...other properties
}

使用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
        })