如何解决上下文ID

时间:2016-10-31 16:49:35

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

我有一个名为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"); 
    }
}

2 个答案:

答案 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(报告)失败但员工添加没有失败会发生什么。