Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在EFCore中更新更复杂的对象?_C#_Entity Framework_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# 如何在EFCore中更新更复杂的对象?

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;

我想更新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; }
    }
        [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();
        }
几个问题:

  • 您将从UserProjects集合开始,而不是从项目集合开始
  • 在pr变量中,您仍然在创建UserProjects的集合,因为您运行的是where,而不是firstOrDefault
  • 您正在尝试将UserProjects列表作为单个项目类型发送
  • 首先确保PR是单一的,而不是集合。然后,如果UserProjects与Projects相同,则可以使用AutoMapper将USerProject映射到一种类型的项目,然后进行更新

    这里最大的线索是错误消息,一种类型不能是另一种类型。

    几个问题:

  • 您将从UserProjects集合开始,而不是从项目集合开始
  • 在pr变量中,您仍然在创建UserProjects的集合,因为您运行的是where,而不是firstOrDefault
  • 您正在尝试将UserProjects列表作为单个项目类型发送
  • 首先确保PR是单一的,而不是集合。然后,如果UserProjects与Projects相同,则可以使用AutoMapper将USerProject映射到一种类型的项目,然后进行更新


    这里最大的线索是错误消息,一种类型不能是另一种类型。

    将我的代码更改为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或从中提取项目不是一个好主意在我身边。你的回答帮了我很多,谢谢。你意识到我提供了同样的答案,而且更完整。使用用户项目或从中提取项目对我来说不是个好主意。你的回答对我帮助很大,非常感谢