我使用 Visual Studio 2015 和 SQLServer 数据库创建了一个系统,我可以查询数据库但不能保存对其的更改。所以我在 Visual Studio 中创建了数据库。我现在尝试在 MySQL Workbench 中创建数据库并遇到同样的问题。我切换到mysql,因为我不确定我是否正确安装了My SQL Server,我肯定已经正确安装了mysql,因为我在Java项目中使用了它。 我使用代码优先技术创建了数据库,效果很好。有任何想法吗? 应用程序设置中的连接字符串
"DataAccessMySqlProvider": "server=localhost;port=3306;database=rentalsdb;userid=root;password=******"
在 Startup.cs 中
var sqlConnectionString = Configuration.GetConnectionString("DataAccessMySqlProvider");
services.AddMvc();
services.AddDbContext<RentalsDbContext>(options =>
options.UseMySQL(
sqlConnectionString,
b => b.MigrationsAssembly("RentalsRated.Web")));
services.AddDbServiceDependencies(sqlConnectionString);
然后在我的仓库中
public bool CreateUser(UserAccount user)
{
if (user != null)
{
try
{
_Context.UserAccounts.Add(user);
_Context.Entry(user).State = EntityState.Modified;
_Context.SaveChanges();
return true;
}
catch ....
我可以看到这里有正确的变量。这一切都与 Visual Studios 服务器资源管理器中的数据库配合良好。 谢谢!
IndexOutOfRangeException:索引超出数组范围。
堆栈跟踪:位于 Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection 连接)
在 Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(Tuple2 参数)
在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList
1 个条目ToSave)...
更新:当我注释掉作为 Byte[] 传递的数据时有效。
最佳答案
根本原因: 密码和盐字段定义为 blob。将密码和盐字段的类型更改为字符串类型之一。
屏蔽问题: 您在将实体添加到表后立即将其状态更改为“已修改”,这可能会破坏上下文的内部状态。
MSDN 建议使用两种不同的方式将新实体添加到上下文中 https://msdn.microsoft.com/en-us/library/jj592676(v=vs.113).aspx
1) 通过将实体直接添加到表中。
using (var context = new BloggingContext())
{
var blog = new Blog { Name = "ADO.NET Blog" };
context.Blogs.Add(blog);
context.SaveChanges();
}
2) 通过将实体的状态更改为已添加
using (var context = new BloggingContext())
{
var blog = new Blog { Name = "ADO.NET Blog" };
context.Entry(blog).State = EntityState.Added;
context.SaveChanges();
}
关于c# - 我可以查询 mysql DB 但无法保存对其的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43375062/