C# 如何在EFCore中更新更复杂的对象?
我想更新asp.net core 2项目中的复杂对象属性 我的UserProjects类看起来像:C# 如何在EFCore中更新更复杂的对象?,c#,entity-framework,asp.net-core,entity-framework-core,C#,Entity Framework,Asp.net Core,Entity Framework Core,我想更新asp.net core 2项目中的复杂对象属性 我的UserProjects类看起来像: public class UserProject { public int UserId { get; set; } public User User { get; set; } public int ProjectId { get; set; } public Project Project { get; set;
public class UserProject
{
public int UserId { get; set; }
public User User { get; set; }
public int ProjectId { get; set; }
public Project Project { get; set; }
}
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var result = _context.UserProjects.Where(x => x.UserId == userId && x.ProjectId ==
projectId);
if (result != null)
{
// Make changes on entity
var pr = result.Where(x => x.Project.Status == ProjectStatus.Ready);
// Update entity in DbSet
_context.Projects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var project = _context.Projects.Where(x => x.Id == projectId);
{
// Make changes on entity
var pr = project.FirstOrDefault(x => x.Status == ProjectStatus.Ready);
pr.Status = ProjectStatus.Pending; //update the status
// Update entity in DbSet
_context.Projects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
我要将项目状态从就绪更改为挂起的方法。对于我知道的简单对象,但对于复杂对象,我无法实现entry.ProjectStatus等参数,甚至我将使用我的_context.Projects。
我的方法如下所示:
public class UserProject
{
public int UserId { get; set; }
public User User { get; set; }
public int ProjectId { get; set; }
public Project Project { get; set; }
}
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var result = _context.UserProjects.Where(x => x.UserId == userId && x.ProjectId ==
projectId);
if (result != null)
{
// Make changes on entity
var pr = result.Where(x => x.Project.Status == ProjectStatus.Ready);
// Update entity in DbSet
_context.Projects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var project = _context.Projects.Where(x => x.Id == projectId);
{
// Make changes on entity
var pr = project.FirstOrDefault(x => x.Status == ProjectStatus.Ready);
pr.Status = ProjectStatus.Pending; //update the status
// Update entity in DbSet
_context.Projects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
您的错误是您试图使用
UserProject
类更新Projects
。在结果查询中,您将返回UserObject
在更新时,您将更新项目
对象,
这与您的UserProjects
不同
我看到两种解决方案,根据需要选择
首先更新项目
对象:
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var result = _context.UserProjects.First(x => x.UserId == userId && x.ProjectId ==
projectId).Select(up => up.Project);
if (result != null)
{
// Make changes on entity
var pr = result.FirstOrDefault(x => x.Status == ProjectStatus.Ready);
pr.Status = ProjectStatus.Pending; //update
// Update entity in DbSet
_context.Projects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
第二次更新用户项目
对象
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var result = _context.UserProjects.First(x => x.UserId == userId && x.ProjectId ==
projectId);
if (result != null)
{
// Make changes on entity
var pr = result.FirstOrDefault(x => x.Project.Status == ProjectStatus.Ready);
pr.Peoject.Status = ProjectStatus.Pending; //update the status
// Update entity in DbSet
_context.UserProjects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
您的错误是您试图使用
UserProject
类更新Projects
。在结果查询中,您将返回UserObject
在更新时,您将更新项目
对象,
这与您的UserProjects
不同
我看到两种解决方案,根据需要选择
首先更新项目
对象:
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var result = _context.UserProjects.First(x => x.UserId == userId && x.ProjectId ==
projectId).Select(up => up.Project);
if (result != null)
{
// Make changes on entity
var pr = result.FirstOrDefault(x => x.Status == ProjectStatus.Ready);
pr.Status = ProjectStatus.Pending; //update
// Update entity in DbSet
_context.Projects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
第二次更新用户项目
对象
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var result = _context.UserProjects.First(x => x.UserId == userId && x.ProjectId ==
projectId);
if (result != null)
{
// Make changes on entity
var pr = result.FirstOrDefault(x => x.Project.Status == ProjectStatus.Ready);
pr.Peoject.Status = ProjectStatus.Pending; //update the status
// Update entity in DbSet
_context.UserProjects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
几个问题:
这里最大的线索是错误消息,一种类型不能是另一种类型。将我的代码更改为Project,现在可以正常工作了: 代码如下所示:
public class UserProject
{
public int UserId { get; set; }
public User User { get; set; }
public int ProjectId { get; set; }
public Project Project { get; set; }
}
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var result = _context.UserProjects.Where(x => x.UserId == userId && x.ProjectId ==
projectId);
if (result != null)
{
// Make changes on entity
var pr = result.Where(x => x.Project.Status == ProjectStatus.Ready);
// Update entity in DbSet
_context.Projects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var project = _context.Projects.Where(x => x.Id == projectId);
{
// Make changes on entity
var pr = project.FirstOrDefault(x => x.Status == ProjectStatus.Ready);
pr.Status = ProjectStatus.Pending; //update the status
// Update entity in DbSet
_context.Projects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
将我的代码更改为Project,现在可以正常工作: 代码如下所示:
public class UserProject
{
public int UserId { get; set; }
public User User { get; set; }
public int ProjectId { get; set; }
public Project Project { get; set; }
}
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var result = _context.UserProjects.Where(x => x.UserId == userId && x.ProjectId ==
projectId);
if (result != null)
{
// Make changes on entity
var pr = result.Where(x => x.Project.Status == ProjectStatus.Ready);
// Update entity in DbSet
_context.Projects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
[HttpPost("changeprojectstatus/{userId}/{projectId}")]
public IActionResult ChangeProjectStatus(int userId, int projectId)
{
var project = _context.Projects.Where(x => x.Id == projectId);
{
// Make changes on entity
var pr = project.FirstOrDefault(x => x.Status == ProjectStatus.Ready);
pr.Status = ProjectStatus.Pending; //update the status
// Update entity in DbSet
_context.Projects.Update(pr);
_context.SaveChanges();
}
if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
return Unauthorized();
return Ok();
}
那么,你的方法有什么问题?您能提供更具体的信息吗?您得到的异常是什么?您的意思是更新类的包含对象吗?如果是这样,您需要使用
UserProject.Project=new Project()…
这是推荐的方法。在我的代码中,我发现项目状态已准备就绪,我想将其更改为挂起,并且代码中缺少此部分。在这段代码中,它抛出异常,无法将UserProjects转换为Project@panoskarajohn如果可能的话,你能用codeOk更精确一点吗?我看到你说的错误了。添加到您的结果中
查询此\u context.UserProjects.Where(x=>x.UserId==UserId&&x.projectd==projectd)。选择(up=>up.Project)
那么您的方法有什么问题?您能提供更具体的信息吗?您得到的异常是什么?您的意思是更新类的包含对象吗?如果是这样,您需要使用UserProject.Project=new Project()…
这是推荐的方法。在我的代码中,我发现项目状态已准备就绪,我想将其更改为挂起,并且代码中缺少此部分。在这段代码中,它抛出异常,无法将UserProjects转换为Project@panoskarajohn如果可能的话,你能用codeOk更精确一点吗?我看到你说的错误了。添加到您的结果中
查询此\u context.UserProjects.Where(x=>x.UserId==UserId&&x.projectd==projectd)。选择(up=>up.Project)
:)与我同时发布即可。他/她被困在EF core的更新中。不仅在不同类型的错误。你应该更新你的答案。也可以随意编辑我的。对象引用未设置为对象的实例。
我遇到了这个错误,这意味着您没有生成任何结果,这意味着null
。这就是为什么你会犯这个错误。您应该检查null,如果是,则不进行更新。这是因为FirstOrDefault
。如果您有First
,代码将抛出一个异常->@panoskarajohn I cahnged to FirstOrDefault这次没有编译器错误,但对象引用未设置为对象的实例:)与Metat同时发布是正常的。他/她被困在EF core的更新中。不仅在不同类型的错误。你应该更新你的答案。也可以随意编辑我的。对象引用未设置为对象的实例。
我遇到了这个错误,这意味着您没有生成任何结果,这意味着null
。这就是为什么你会犯这个错误。您应该检查null,如果是,则不进行更新。这是因为FirstOrDefault
。如果您有First
代码将抛出一个异常->@panoskarajohn I cahnged to FirstOrDefault这次没有编译器错误,但是对象引用未设置为对象的实例
您会意识到我提供了相同的答案,而且更完整..?使用UserProjects或从中提取项目不是一个好主意在我身边。你的回答帮了我很多,谢谢。你意识到我提供了同样的答案,而且更完整。使用用户项目或从中提取项目对我来说不是个好主意。你的回答对我帮助很大,非常感谢