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

实体框架核心:一对多无外键?

杜建章
2023-03-14

我有一个ASP MVC.NET核心(C#)项目,由于业务原因,SQL表不能有外键,因此,EF模型不映射关系(Entity.HasMany...)。

假设EF为实体project生成一个模型,为task生成一个模型。我想知道他们两个之间的关系。一个项目有多个任务并且一个任务属于一个项目。该任务在数据库中有项目Id(但请记住,它没有设置为FK)。

现在,我想通过linqto Entity获得一个项目列表,同时获得每个项目的任务列表。我通过创建一个自定义类customProject(EF创建的类除外)并执行以下操作实现了这一点:

List<CustomProject> projects = (from p in db.Project
                                select new CustomProject {
                                   //Properties
                                   Tasks = db.Tasks.Where(t => t.IdProject == p.IdProject).ToList()
                                }).ToList();

问题是,我不想创建自定义类,也不想使用那个符号,我只想使用db.projects.include(“tasks”)就这样。

现在,我不介意创建自定义类,但只要我没有几乎相同的东西,而是由EF创建的(有projectcustomproject,只有其中一个),我不知道是否有办法告诉EF“嘿,我手动创建的这个自定义类与数据库中的这个表相关,并以这种方式映射它……”。

附注。我听说它会创建另一个分部类,但我不知道...

谢谢

共有1个答案

沈健
2023-03-14

我只想使用db.projects.include(“tasks”)就这样...

您不能这样做,因为要使用include()方法,您需要一个数据关系(即基于外键的关系)。

问题是,我不想创建自定义类,也不想使用那个符号

如果没有基于外键的关系,我认为您没有更好的符号选择--您必须使用select()投影。

您可以避免创建CustomProject模型,方法是在Project模型中添加一个Task集合,并用[NotMapped]进行批注,如下所示-

public class Project
{
    public int Id { get; set; }
    public string Title { get; set; }

    [NotMapped]
    public List<Task> Tasks { get; set; }
}

public class Task
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int ProjectId { get; set; }
}

如果没有[NotMapped]属性,EF将基于project中的导航属性taskstask中的外键属性projectId创建一对多关系。[NotMapped]将阻止此操作。

然后可以使用project模型执行查询,例如-

List<Project> projects1 = (from p in dbCtx.Projects
                            select new Project
                            {
                                Id = p.Id,
                                Name = p.Name,
                                Tasks = dbCtx.Tasks.Where(t => t.ProjectId == p.Id).ToList()
                            }).ToList();

或者,就像-

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

  • 我有一个带有表的旧数据库,该表只有一行,没有主键。当我尝试更新此行时,什么都没有发生。我搜索了很多,找到了这行代码(dbf.Entry(nextPro))。状态=实体状态。已修改;) 。添加此代码时,我遇到了错误:“无法跟踪类型为‘NxtId’的实例,因为它没有主键。只能跟踪具有主键的实体类型。” 我无法删除该行并添加新行。我无法添加主键。我有唯一的选择来以某种方式更新行。 实体:

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

  • 我已经找到了几个这样的帖子,但不能确定我在这里做错了什么。 我试着在两张桌子上各放一个项目。第二项包含对第一项的查找。我可以在没有问题的情况下为父级添加种子,但无法找到正确的语法来为子级添加种子。 下面是我用来种子父级的代码 下面是种子子的代码--这将失败: 根据文档的建议,我使用了一个匿名对象,而不是类本身。我也尝试过同时使用navigation属性、外键和nav道具。ID=1的组肯定已经在db

  • 我想使用即时加载在实体框架核心中获得多个嵌套级别的子表。我认为延迟加载还没有实现。 我找到了EF6的答案。 我的问题是,EF Core中无法识别选择 错误CS1061“雇员”不包含“选择”的定义,并且找不到接受“雇员”类型的第一个参数的扩展方法“选择”(您是否缺少使用指令或程序集引用?) 我包含的命名空间: EF Core中的选择选项是什么。

  • 我只能访问ICollection本身(listB)的属性,而不能访问其中包含的B对象的属性,这样我就可以在其中包含C对象。 我设法手动完成这一操作(这比我希望的要详细得多),分别加载对象并在其中包含我想要的内容,然后才将它们添加到a的列表中。然而,在我的现实生活中,我想在下面的级别中包含的属性也是用于集合的,所以这变得越来越不实用。有没有更简单、更优雅的方法呢?