值不保存到数据库(SaveChanges();不起作用)

时间:2019-03-28 15:32:39

标签: asp.net asp.net-core view controller

我为我的班级创建了一个控制器,并使用SaveChanges();将输入值保存到数据库。但是此代码存在错误:

using (var db = _ServiceProvider.GetRequiredService<ApplicationDbContext>())
{
   db.Members.Add(members);
   db.SaveChanges();
}

错误:

DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(DbContext _, ValueTuple<IEnumerable<ModificationCommandBatch>, IRelationalConnection> parameters)
Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute<TState, TResult>(TState state, Func<DbContext, TState, TResult> operation, Func<DbContext, TState, ExecutionResult<TResult>> verifySucceeded)
Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable<ModificationCommandBatch> commandBatches, IRelationalConnection connection)
Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList<InternalEntityEntry> entriesToSave)
Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(bool acceptAllChangesOnSuccess)
Microsoft.EntityFrameworkCore.DbContext.SaveChanges(bool acceptAllChangesOnSuccess)
MyLib.Controllers.AccountController.create(Members members) in AccountController.cs
-
            using (var db = _ServiceProvider.GetRequiredService<ApplicationDbContext>())
            {
                db.Members.Add(members);
                db.SaveChanges();
            }
            return View();
        }
lambda_method(Closure , object , Object[] )
Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(object target, Object[] parameters)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeActionMethodAsync>d__12.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeNextActionFilterAsync>d__10.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeInnerFilterAsync>d__14.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeNextResourceFilter>d__22.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeFilterPipelineAsync>d__17.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker+<InvokeAsync>d__15.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Builder.RouterMiddleware+<Invoke>d__4.MoveNext()
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware+<Invoke>d__7.MoveNext()

2 个答案:

答案 0 :(得分:0)

首先,您是通过作用域对象(控制器)执行此操作的,但是您使用的是服务定位符反模式(甚至不正确)。不要注入IServiceProvider,而是直接将上下文注入控制器。将其保存到私有ivar,然后使用 that ,即:

private readonly ApplicationDbContext _db;

public AccountController(ApplicationDbContext db)
{
    _db = db;
}

然后:

_db.Members.Add(members);
_db.SaveChanges();
return View();

对于实际错误,很难说出您提供的内容。 members变量的名称可疑。复数应表示事物清单。可能您只是错误地命名了变量,但是如果它是列表,则需要使用AddRange来代替

_db.Members.AddRange(members);

然后,假设您添加的内容实际上可以验证并且可以正确保存。同样,您的问题中没有任何信息可以回答该问题,但是您应该确保检查了ModelState.IsValid之类的东西,并假设您实际使用的是视图模型,并且已从视图模型正确映射。同样,那里没有数据,但是如果您不使用视图模型,应该这样做。尝试保存直接从POST主体创建的实体,并且结果处于不一致状态的结果可能是错误的。

答案 1 :(得分:0)

我尝试了您建议的方法,但仍然不可能。 这是我的控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using MyLib.Models;

namespace MyLib.Controllers
{
    public class AccountController : Controller
    {




        private IServiceProvider _ServiceProvider;

        public AccountController(IServiceProvider iServiceProvider)
        {
            _ServiceProvider = iServiceProvider;
        }





        [HttpGet]
        public IActionResult create()
        {
            return View();
        }
        [HttpPost]
        public IActionResult create(Members members)
        {
            if (!ModelState.IsValid)
            {
                return View(members);
            }



            using (var db = _ServiceProvider.GetRequiredService<ApplicationDbContext>())
            {
                db.Members.Add(members);
                db.SaveChanges();
            }

            return View();


        }
    }
}

这是我的连接字符串:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        var connection = "Data Source= .; Initial catalog= MyLibNewDatabase;user id=hr;Password=1;";
        services.AddEntityFrameworkSqlServer().AddDbContext<ApplicationDbContext>(option => option.UseSqlServer(connection));
    }

错误: An image