C# 如何解析上下文id

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

我有一个名为companyContext的上下文。有三个表:报告、日志和员工。我正试图将另一名员工添加到我的员工表中,但我有一个表报告,记录哪些员工属于案例(CaseID),以及是否有发生事件的日志。将雇员添加到上下文后,我需要添加一个带有刚刚添加的雇员id的报告(这是一个主键,因此不能通过employee变量传递)。我能想到的唯一方法是获取employees表的当前计数。这似乎是个坏习惯。有没有更好的方法来实现这一点?
澄清:
我正在从我的客户端发送一个雇员对象。名称和代码是对象中唯一不为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(),员工和报表都会自动保存