Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.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# 无法使上下文中的更改保持不变_C#_Asp.net Mvc_Entity Framework_N Tier Architecture - Fatal编程技术网

C# 无法使上下文中的更改保持不变

C# 无法使上下文中的更改保持不变,c#,asp.net-mvc,entity-framework,n-tier-architecture,C#,Asp.net Mvc,Entity Framework,N Tier Architecture,我正在开发一个简单的三层MVC应用程序,无法持续进行上下文更改。这是我的密码: 控制器: [HttpPost] public IActionResult Register(UserDto user) { userService.Register(user); return Ok("profile"); } 服务: public void Register(UserDto userDto) { Use

我正在开发一个简单的三层MVC应用程序,无法持续进行上下文更改。这是我的密码:

控制器:

    [HttpPost]
    public IActionResult Register(UserDto user)
    {
        userService.Register(user);
        return Ok("profile");
    }
服务:

    public void Register(UserDto userDto)
    {
        User user = new User();
        user.FirstName = userDto.FirstName;
        user.LastName = userDto.LastName;
        user.Type = (UserType) userDto.Type;
        unitOfWork.UserRepository.AddAsync(user);
    }
存储库:

    public Repository(ApplicationDbContext dbContext)
    {
        this.dbContext = dbContext;
        this.dbSet = dbContext.Set<T>();
    }

    public async Task AddAsync(params T[] entities)
    {
        await dbSet.AddRangeAsync(entities);
        await SaveChanges();
    }

    private async Task SaveChanges()
    {
        await dbContext.SaveChangesAsync();
    }
公共存储库(ApplicationDbContext dbContext)
{
this.dbContext=dbContext;
this.dbSet=dbContext.Set();
}
公共异步任务AddAsync(参数T[]实体)
{
等待dbSet.addRangeAncy(实体);
等待SaveChanges();
}
私有异步任务SaveChanges()
{
等待dbContext.saveChangesSync();
}

使用我的调试器,我发现dbset.addRangeAncy确实将我在请求中设置的实体添加到我的dbContext中。问题是,在下一个请求中,实体已从dbContext中消失,也未出现在我的数据库中。有人能解释一下我的错误吗?

您的add方法是异步的。调用此方法的其他方法必须是异步的

 public async Task Register(UserDto userDto)
    {
        User user = new User();
        user.FirstName = userDto.FirstName;
        user.LastName = userDto.LastName;
        user.Type = (UserType) userDto.Type;
       await unitOfWork.UserRepository.AddAsync(user);
    }



    [HttpPost]
    public async Task<IActionResult> Register(UserDto user)
    {
       await userService.Register(user);
        return Ok("profile");
    }
公共异步任务寄存器(UserDto-UserDto)
{
用户=新用户();
user.FirstName=userDto.FirstName;
user.LastName=userDto.LastName;
user.Type=(UserType)userDto.Type;
等待unitOfWork.UserRepository.AddAsync(用户);
}
[HttpPost]
公共异步任务寄存器(用户到用户)
{
等待用户服务。注册(用户);
返回Ok(“配置文件”);
}

True,但这不是真正的问题
SaveChanges
仍然可以工作。在控制器中,userService.Register(user)会在请求完成后执行,此时dbcontext会被处理。这里有一点,但这会引发异常,这不是OP的经验,dbset.addRangeAncy会添加实体。当我看到“saved successfully”+“not in the database”涉及localdb时,几乎总是会出现另一种localdb混乱。经过更多的调试,我发现:如果在startup.cs中的Configure方法中,我在上下文中添加了一个实体并保存了更改,那么addRangeAncy也会被保存。否则,它不会。你知道怎么做吗?我甚至不知道如何在其他SO问题上搜索此错误。您是否碰巧使用了localdb?对不起,但我不知道是否使用了localdb。对于数据库,我使用SQLServerExplorer。它在myusers/{user}文件夹中创建了一个.mdf文件。请查找有关类似localdb问题的其他问题。另外,作为一个附带条件,请查看答案并使您的代码始终保持异步。我刚刚注意到,我的解决方案中没有.mdf文件,尽管我的数据库确实存在(因为更改不会持久,所以它是空的)。如果重要的话,我正在使用EF Core。.mdf不存在是正常的还是可能是问题所在?