C# 如何解析上下文id
我有一个名为companyContext的上下文。有三个表:报告、日志和员工。我正试图将另一名员工添加到我的员工表中,但我有一个表报告,记录哪些员工属于案例(CaseID),以及是否有发生事件的日志。将雇员添加到上下文后,我需要添加一个带有刚刚添加的雇员id的报告(这是一个主键,因此不能通过employee变量传递)。我能想到的唯一方法是获取employees表的当前计数。这似乎是个坏习惯。有没有更好的方法来实现这一点?C# 如何解析上下文id,c#,entity-framework,asp.net-core,asp.net-core-mvc,entity-framework-core,C#,Entity Framework,Asp.net Core,Asp.net Core Mvc,Entity Framework Core,我有一个名为companyContext的上下文。有三个表:报告、日志和员工。我正试图将另一名员工添加到我的员工表中,但我有一个表报告,记录哪些员工属于案例(CaseID),以及是否有发生事件的日志。将雇员添加到上下文后,我需要添加一个带有刚刚添加的雇员id的报告(这是一个主键,因此不能通过employee变量传递)。我能想到的唯一方法是获取employees表的当前计数。这似乎是个坏习惯。有没有更好的方法来实现这一点? 澄清: 我正在从我的客户端发送一个雇员对象。名称和代码是对象中唯一不为nu
澄清:
我正在从我的客户端发送一个雇员对象。名称和代码是对象中唯一不为null的内容
public async Task<IActionResult> addEmployee([FromBody] Employee employee) {
try {
context.Employees.Add(employee);
var c = storage.GetCase(employee);
var employeeId = await context.Employees.CountAsync();
var report = new Report {
CaseID = c.Id,
EmployeeID = employeeId,
};
context.Reports.Add(report);
return Json(employee);
} catch (Exception ex){
logger.LogError("Employee exception in Company Controller", ex);
return BadRequest("Unexpected Error");
}
}
public异步任务addEmployee([FromBody]Employee){
试一试{
context.Employees.Add(雇员);
var c=storage.GetCase(employee);
var employeeId=await context.Employees.CountAsync();
var报告=新报告{
CaseID=c.Id,
EmployeeID=EmployeeID,
};
context.Reports.Add(报告);
返回Json(员工);
}捕获(例外情况除外){
logger.LogError(“公司控制器中的员工异常”,ex);
返回错误请求(“意外错误”);
}
}
模型
public class Log
{
public int ID { get; set; }
public string Input { get; set; }
public string Tag { get; set; }
public DateTime LogDate { get; set; }
public ICollection<Report> Reports { get; set; }
}
public class Employee
{
public int ID { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public ICollection<Report> Reports { get; set; }
}
public class Report
{
public int ID { get; set; }
public string CaseID { get; set; }
public int EmployeeID { get; set; }
public int? LogID { get; set; }
public Employee Employee { get; set; }
public Log Log { get; set; }
}
公共类日志
{
公共int ID{get;set;}
公共字符串输入{get;set;}
公共字符串标记{get;set;}
公共日期时间日志日期{get;set;}
公共ICollection报告{get;set;}
}
公营雇员
{
公共int ID{get;set;}
公共字符串代码{get;set;}
公共字符串名称{get;set;}
公共ICollection报告{get;set;}
}
公开课报告
{
公共int ID{get;set;}
公共字符串CaseID{get;set;}
public int EmployeeID{get;set;}
公共int?LogID{get;set;}
公共雇员雇员{get;set;}
公共日志日志{get;set;}
}
苏蒂翁
public async Task<IActionResult> addEmployee([FromBody] Employee employee) {
try {
context.Employees.Add(employee);
await context.SaveChangesAsync();
var c = storage.GetCase(employee);
var report = new Report {
CaseID = c.Id,
EmployeeID = employee.ID,
};
context.Reports.Add(report);
await context.SaveChangesAsync()
return Json("Worked");
} catch (Exception ex){
logger.LogError("Employee exception in Company Controller", ex);
return BadRequest("Unexpected Error");
}
}
public异步任务addEmployee([FromBody]Employee){
试一试{
context.Employees.Add(雇员);
wait context.saveChangesSync();
var c=storage.GetCase(employee);
var报告=新报告{
CaseID=c.Id,
EmployeeID=employee.ID,
};
context.Reports.Add(报告);
wait context.SaveChangesAsync()
返回Json(“已工作”);
}捕获(例外情况除外){
logger.LogError(“公司控制器中的员工异常”,ex);
返回错误请求(“意外错误”);
}
}
不要这样做:
context.Reports.Add(report);
您可以这样做:
employee.Reports.Add(report);
保存员工记录时,在将其保存到数据库之前,它将知道在报表对象中设置EmployeeID值
您可能还需要将其添加到Employee对象中,以确保设置了报告集合:
public Employee()
{
Reports = new HashSet<Report>();
}
公共雇员()
{
Reports=newhashset();
}
不要这样做:
context.Reports.Add(report);
您可以这样做:
employee.Reports.Add(report);
保存员工记录时,在将其保存到数据库之前,它将知道在报表对象中设置EmployeeID值
您可能还需要将其添加到Employee对象中,以确保设置了报告集合:
public Employee()
{
Reports = new HashSet<Report>();
}
公共雇员()
{
Reports=newhashset();
}
尝试从保存的EmployeeId中使用它,即
var report = new Report {
CaseID = c.Id,
EmployeeID = employee.ID
};
保存时应直接获取ID
问题,您在实体中不使用“虚拟方法”进行延迟加载有什么具体原因吗
我也会考虑如果上下文.Word.Addio.(报告)失败但是雇员Advad没有失败,将会发生什么。 尝试使用保存的EmployeeId,即
var report = new Report {
CaseID = c.Id,
EmployeeID = employee.ID
};
保存时应直接获取ID
问题,您在实体中不使用“虚拟方法”进行延迟加载有什么具体原因吗
我也会考虑如果上下文.Word.Addio.(报告)失败但是雇员Advad没有失败,将会发生什么。 您的表是否将Id字段设置为自动递增?如果是这样,Id字段将在添加后自动设置顺序值。John,请阅读帮助中心关于如何正确使用标记的条目:以及为什么不将它们强制添加到标题中。此外,请使用ASP.NET Core相关标记
ASP.NET Core
/ASP.NET Core mvc
/entity framework Core
,而不是旧版ASP.NET webstack的标记,这样正确的人可能会发现它们。您的表是否将Id字段设置为自动递增?如果是这样,Id字段将在添加后自动设置顺序值。John,请阅读帮助中心关于如何正确使用标记的条目:以及为什么不将它们强制添加到标题中。此外,请使用ASP.NET Core相关标记ASP.NET Core
/ASP.NET Core mvc
/entity framework Core
,而不是旧版ASP.NET webstack的标记,因此正确的人可能会发现它们,这就是您的意思=>var report=new report{CaseID=c.Id,};employee.Reports.Add(报表);对于上下文,我必须执行save方法。表是否按您的方式自动保存?正确,一旦执行context.SaveChanges(),员工和报告记录都将保存到数据库中,并且report.EmployeeID将设置为EmployeeException抛出的键:Application-report.dll中的System.NullReferenceException失败:Application.Controllers.CompanyController[0].我猜这是因为它是从客户端发送的,客户端没有设置任何引用。所以我可以在employees上下文中查询匹配的条目,然后尝试您的方法;employee.Reports.Add(报表);对于上下文,我必须执行save方法。表是否按照您的方式自动保存?正确,一旦执行context.SaveChanges(),员工和报表都会自动保存