当前位置: 首页 > 知识库问答 >
问题:

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

阎晋
2023-03-14

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

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

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

   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个答案

史烨
2023-03-14

将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
        })
 类似资料:
  • 我有一个简单的问题,但似乎找不到解决的办法。我使用的是EntityFramework核心版本2.0.1,希望在默认情况下加载所有实体。 示例: 但当我加载订单实体时,相关实体Customer及其内部地址为null 我所尝试的: 尝试升级到版本2.1并使用LazyLoadingProxies设置为false 这只是一个例子,我有多个嵌套级别的实体,我想在通用存储库中加载嵌套的相关数据,因此不能使用I

  • 我正在使用EF Core(v1.1.3)和C#。 在我的单元测试中,我使用代码优先db模型创建了一个sqlite内存数据库,然后用一些测试数据填充它。但是,当从dB加载实体列表时,相关实体会被填充,尽管没有使用“。包含”。 如果我使用相同的模型来创建一个实际的磁盘数据库,并进行相同的加载,那么只有在使用<代码>时,才会加载相关的实体。包括。 这是sqlite内存实现(v1.1.0)中的错误,还是我

  • 我有一个ASP MVC.NET核心(C#)项目,由于业务原因,SQL表不能有外键,因此,EF模型不映射关系(Entity.HasMany...)。 假设EF为实体生成一个模型,为生成一个模型。我想知道他们两个之间的关系。一个有多个并且一个属于一个。该任务在数据库中有项目Id(但请记住,它没有设置为FK)。 现在,我想通过to Entity获得一个项目列表,同时获得每个项目的任务列表。我通过创建一个

  • 问题内容: 我已经制作了一个简单的Entity Framework ASP Core Application,它可以工作,但是我不知道为什么: 我做了这样的上下文: 我有两个表,像这样的模型: 有趣的是,当我运行我的应用程序时,它实际上可以拾取数据。似乎很奇怪,因为我没有指定任何表映射。我假设这只是自动映射,因为指定的表具有相同的名称。 我的问题是: 如果我不希望模型名称与数据库完全相同,该如何指

  • 我不确定我是否完全正确地处理了这个问题。 背景:我有一个控制器动作GET foo()作为例子。这个foo()需要调用bar(),bar()可能需要很长时间。所以,我需要foo()在bar()完成之前(或无论何时)用“确定”来响应。 稍微复杂一点的是,bar()需要访问DBContext并从数据库中获取一些数据。在我当前的实现中,当我试图通过bar访问数据库时,会出现“DBContext Syste

  • 我试图使用实体框架核心从我的表中检索一行。这似乎很简单,但我无法让它工作。 我可以通过使用获得列表 _上下文。国家。ToList(); 这给了我表格中国家的完整列表。现在我只需要得到一个与ID匹配的国家。如何做到这一点,因为EF核心中缺少Find()。我们可以选择在哪里吗。谁能帮我理解一下语法吗。 我的国家/地区模型如下所示 公共部分类COUNTRY{public string COUNTRYID