我有一个名为companyContext的上下文。报表,日志和员工有三个表。我试图将另一个员工添加到我的员工表中,但是我有一个表格,用于跟踪哪些员工属于案例(CaseID)以及是否有发生的事件的日志。在我将员工添加到上下文后,我需要添加一个带有刚添加的员工ID的报告(这是一个主键,所以它不会与employee变量一起传递)。我能想到的唯一方法就是获得员工表的当前计数。这似乎是不好的做法。有没有更好的方法来实现这一点?
澄清:
我从客户端发送了Employee员工对象。 Name和Code是对象中唯一不为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 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; }
}
Soultion
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");
}
}
答案 0 :(得分:1)
而不是这样做:
md_alg
你可以这样做:
context.Reports.Add(report);
保存员工记录后,在将对象保存到数据库之前,它将知道在Report对象中设置EmployeeID值。
您可能还需要在Employee对象中添加它以确保设置了Report集合:
employee.Reports.Add(report);
答案 1 :(得分:1)
尝试使用已保存的EmployeeId,即
var report = new Report {
CaseID = c.Id,
EmployeeID = employee.ID
};
保存时,应直接获取ID。
问题,为什么你没有在实体中使用“虚方法”进行延迟加载有什么特别的原因?
我还会考虑如果context.reports.add(报告)失败但员工添加没有失败会发生什么。