我有一个ASP MVC.NET核心(C#)项目,由于业务原因,SQL表不能有外键,因此,EF模型不映射关系(Entity.HasMany...)。
假设EF为实体project
生成一个模型,为task
生成一个模型。我想知道他们两个之间的关系。一个项目
有多个任务
并且一个任务
属于一个项目
。该任务在数据库中有项目Id(但请记住,它没有设置为FK)。
现在,我想通过linq
to 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创建的(有project
和customproject
,只有其中一个),我不知道是否有办法告诉EF“嘿,我手动创建的这个自定义类与数据库中的这个表相关,并以这种方式映射它……”。
附注。我听说它会创建另一个分部类,但我不知道...
谢谢
我只想使用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
中的导航属性tasks
和task
中的外键属性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();