我为我的班级创建了一个控制器,并使用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()
答案 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