【问题标题】:Entity Framework Core: One-to-Many with no foreign key?实体框架核心:没有外键的一对多?
【发布时间】:2021-03-17 14:02:58
【问题描述】:

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

假设 EF 为实体 ProjectTask 生成一个模型。我想要他们两个之间的关系。一个Project 有多个Tasks,一个Task 属于一个Project。该任务在数据库中有项目 ID(但请记住,它没有设置为 FK)。

现在我想通过LINQ 向 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 类似“嘿,这个我手动创建的自定义类与数据库中的这个表相关并以这种方式映射它......”。

附:我听说这类似于创建另一个部分类,但我不知道......

谢谢

【问题讨论】:

  • 不确定这是否可能,但为什么那些“商业原因”会故意违背常识和标准?业务规则不应该说明数据如何存储,因为它不应该影响应用程序的业务逻辑。

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


【解决方案1】:

我只想使用db.Projects.Include("Tasks"),仅此而已...

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

问题是,我不想创建自定义类,也不想使用这种表示法

如果没有基于外键的关系,我认为您没有太多选择更好的表示法 - 您必须使用 Select() 投影。

您可以通过在带有[NotMapped] 注释的Project 模型中添加Task 的集合来避免创建CustomProject 模型,如下所示 -

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

【讨论】:

    猜你喜欢
    • 2018-09-24
    • 1970-01-01
    • 2019-02-23
    • 2021-09-03
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    相关资源
    最近更新 更多