在c# app中,如何在SQL中连接子任务表的外键?

Posted

技术标签:

【中文标题】在c# app中,如何在SQL中连接子任务表的外键?【英文标题】:In c# app, how to connect foreign key of subtask table in SQL? 【发布时间】:2021-12-03 19:21:31 【问题描述】:

我正在尝试使用 C# Web API 和 SQL Server 创建任务管理系统。

这是我想要实现的目标:

用户可以发送 POST 请求来创建任务(带有可选的子任务)。 用户可以发送 GET 请求来检索任务(如果存在,则在响应中显示所有子任务)

这是我目前的一些文件:

任务 DTO:

public class TaskDto
        
public int Id  get; set;         
public string Name  get; set;         
public string Description  get; set; 
public DateTime StartDate  get; set; 
public DateTime FinishDate  get; set; 
public string Status  get; set; 

Task.cs:

public class Task

[Key]
public int Id  get; set; 
public string Name  get; set; 
public string Description  get; set; 
public DateTime StartDate  get; set; 
public DateTime FinishDate  get; set;         
public string Status  get; set;         

子任务.cs:

public class SubTask

[Key]
public int Id  get; set; 
public string Name  get; set; 
public string Status  get; set;         

使用上面的代码,我目前能够发布和获取任务,但我正在努力添加子任务部分。

有人可以告诉我需要做什么才能满足这个要求吗?

提前非常感谢

【问题讨论】:

SubTasks 表会有一个 TaskId 列。 【参考方案1】:

你的课程会像这样链接起来......

public class Task
        
 public int Id  get; set;         
 public string Name  get; set;         
 public string Description  get; set; 
 public virtual ICollection<SubTask> SubTask  get; set; 


public class SubTask
        
 public int Id  get; set;         
 public string Name  get; set;         
 public string Description  get; set; 
 public int? TaskId  get; set; 
 public Task Task  get; set; 

您可以看到Task 有一个SubTask 的集合,SubTask 有一个对Task 的引用,带有一个Task 属性和一个TaskId

更新:因为你没有像我最初想的那样使用 EF 代码优先。

您的 DTO 可能只有一个子任务列表,如下所示:

public class TaskDto
            
     public int Id  get; set;         
     public string Name  get; set;         
     public string Description  get; set; 
     public virtual List<SubTask> SubTask  get; set; 
    

然后,您可以执行以下操作:

var tasks = (from t in _db.Tasks
                        join st in _db.Sub Tasks on st.Id equals t.SubTaskId
                        select new TaskDto
                        
                            Id = t.Id,
                            Name = t.Name,
                            Description = t.Description,
                             SubTask = st
                        );

这都是手写的,但会沿着这些路线。

【讨论】:

感谢您的回答,但如果我要使用相同的 DTO 来创建任务(以及可选的子任务),该 DTO 会是什么样子? 从最初的问题开始,我以为您的意思是代码优先,但您使用的是 ADO.NET 吗? 对不起,我没有使用 ADO.NET。我已经更新了我的问题,希望能让事情更清楚 好的,你是怎么查询SQL的?有很多方法可以做到这一点,您可能正在使用 SQL 视图,您可以在一个位置检索所有数据,或者您可能不得不分别查询这两个实体? 我正在使用ApplicationDbContext & linq。这是我的控制器中查询的示例:bool value = _db.Tasks.Any(a =&gt; a.Name.ToLower().Trim() == name.ToLower().Trim());【参考方案2】:

更好的方法是添加属性 nullable ParentTaskId,它只是父任务的任务 ID。我正在考虑任务和子任务具有相同的属性。

否则为子任务创建一个单独的类,并将可为空的parentTaskId作为外键添加到它。

【讨论】:

您好,感谢您的回答。我用我最近的尝试更新了我的问题。我创建了一个Subtask 类,但我不知道要对我的 DTO 等进行哪些更改,以便将两个类链接起来 那我推荐阅读这个文档docs.microsoft.com/en-us/ef/core/modeling/…

以上是关于在c# app中,如何在SQL中连接子任务表的外键?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 和 C# 将表 1 的主键分配为表 2 中的外键

mysql数据库怎么删除一个表的外键

连接操作中的外键

sql [查找表的外键关联]找到一个表的外键postgresql #PostgreSQL

如何分清SQL数据库中的主键与外键

SQL 如何把两个表相关联的数据一同删除