Javascript 数据库未更新错误-实体框架
我正在使用实体框架和JQuery来更新具有位数据类型的SQL表列中的值。这是通过将值读入html表,然后使用一个按钮来更改每行的位值来完成的 在这里您可以看到html表格:Javascript 数据库未更新错误-实体框架,javascript,c#,jquery,asp.net-mvc,entity-framework,Javascript,C#,Jquery,Asp.net Mvc,Entity Framework,我正在使用实体框架和JQuery来更新具有位数据类型的SQL表列中的值。这是通过将值读入html表,然后使用一个按钮来更改每行的位值来完成的 在这里您可以看到html表格: <table id="categoryList" class="table"> <thead> <tr> <th>Category ID</th> <th>Category Name</th&
<table id="categoryList" class="table">
<thead>
<tr>
<th>Category ID</th>
<th>Category Name</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.Categories)
{
<tr>
<td>@item.id</td>
<td>@item.name</td>
<td>
<button class="btn btn-success categoryEnabled" data-id="@item.id">Enabled</button>
</td>
</tr>
}
</tbody>
</table>
然后,这将链接到控制器操作,该操作应更改选定行的状态位值并更新:
public void DisableRow(int id)
{
var connection = new CategoryDBEntities();
var record = connection.Categories.Find(id);
if (record == null) return;
record.state = StatesTypes.Disabled;
connection.SaveChanges();
}
以下是供参考的类别对象:
namespace Project.Models
{
using System;
using System.Collections.Generic;
public enum StatesTypes
{
Disabled = 0,
Enabled = 1
}
public partial class Category
{
public int id { get; set; }
public string name { get; set; }
public StatesTypes state { get; set; }
}
}
DbContext:
namespace Project.Models
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class CategoryDBEntities : DbContext
{
public QualityDBEntities()
: base("name=CategoryDBEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<Category> Categories { get; set; }
}
问题是record.state更改为disabled(0),但数据库中的位值没有更改。我一定是遗漏了什么。谢谢你的帮助 我会回答这个问题,因为我非常确定,如果您在某个时候使用了action方法,那么在保存更改之前,您需要这样做
connection.Entry(record).State = EntityState.Modified;
connection.SaveChanges();
这允许EF对传递的记录进行更新。我仍然认为您可能会遇到这样的问题:状态不是布尔值,而是试图保存到一个位字段
幽默我们并尝试以下方法:
public void DisableRow(int id)
{
var connection = new CategoryDBEntities();
var record = connection.Categories.Find(id);
if (record == null) return;
record.state = false; //Assume false for disabled
connection.SaveChanges();
}
connection.Categories.Attach(record);
connection.Entry(record).State = System.Data.Entity.EntityState.Modified;
connection.SaveChanges();
及
我假设您首先使用代码创建数据库,但无论如何,我知道,如果您从现有数据库生成,那么如果字段在数据库中有一点,那么该字段将是bool。需要考虑的其他事项可能是在DB上是一个空列,除非设置默认值。只需替换:
public bool state { get; set; }
//with
public bool? state { get; set; }
看起来您实际上并没有将更改的项提交回数据库。你只是在修改你的复制品 要确保在数据库中更改数据,您需要执行以下操作:
public void DisableRow(int id)
{
var connection = new CategoryDBEntities();
var record = connection.Categories.Find(id);
if (record == null) return;
record.state = false; //Assume false for disabled
connection.SaveChanges();
}
connection.Categories.Attach(record);
connection.Entry(record).State = System.Data.Entity.EntityState.Modified;
connection.SaveChanges();
您的
状态
列根本没有在EF和数据库之间映射
您可以在SQL日志中看到:
SELECT TOP (2)
[Extent1].[id] AS [id],
[Extent1].[name] AS [name]
FROM [dbo].[Category] AS [Extent1]
WHERE [Extent1].[id] = @p0
-- p0: '5' (Type = Int32)
请注意,状态
列根本没有被选中
查看是否已使用注释[NotMapped]
或类似entityTypeConfiguration.Ignore(p=>p.state)
的流畅API配置将state
属性配置为忽略
一旦你修复了这个问题,我希望你会得到一些异常,比如你将一个枚举映射到一个位字段。正如其他人所建议的,您可能希望对属性使用布尔值。最终解决了这个问题!谢谢@Shawn的帮助 实际上发生了一些事情 首先,正如您所建议的,我必须将StatesType枚举更改为bool,以便正确映射:
public partial class Category
{
public int id { get; set; }
public string name { get; set; }
public bool state { get; set; }
}
由于现在是布尔值,我将状态设置为false:
public void DisableRow(int id)
{
var connection = new CategoryDBEntities();
var record = connection.Categories.Find(id);
if (record == null) return;
record.state = false;
connection.SaveChanges();
}
这里的大问题以及它没有显示数据库中任何更改的主要原因是,状态列没有在EF和数据库之间映射(其中一个答案中也引用了状态列)
这是因为state列是在SQLServer管理中创建的;不是VS,所以我必须进入.edmx并单击“从数据库更新模型”,然后刷新表
谢谢你在这件事上的帮助 您说位,但枚举通常映射到整数。你能发送地图吗?另外,您是如何创建数据库的?尝试将位更改为整数Db已创建。我刚刚在现有表中添加了state列。我将尝试将位更改为int。如果我想保留位,我会将枚举更改为什么?在新创建
CategoryDBenties
的行后添加以下代码:connection.Database.Log=s=>Debug.WriteLine(s)代码>。这将输出调用SaveChanges()
时EF生成的SQL。您看到了什么?如何打开VSI的控制台您是否尝试将实体状态标记为已修改?沿着连接线的东西。Entry(record)。State=EntityState.Modified;保存前?这是一个很好的测试。但这不是一个正确的解决方案,因为实体已经是上下文的一部分了。更改属性就足够了。连接断开连接的实体时,需要将实体设置为“已修改”
。我仍然倾向于未正确映射的位。EF在我的经验中一直把比特字段当作代码中的BooLee。我试过了,它仍然没有显示数据库中的变化:/看看我的最新更新BoOL可能需要一个空的?好吧,让我们后退一步,并覆盖一些基础知识:1)你在Debug方法中正确(在调试中)?2) 我假设连接正在工作(记录!=null)?3) 数据库表是否首先由代码正确创建(带有位字段等)。这是一个很好的测试。但这不是一个正确的解决方案,因为实体已经是上下文的一部分了。更改属性就足够了。连接断开连接的实体时,需要将实体设置为“已修改”。Hmmm…这仍然无法解决问题。不太确定还会发生什么
public void DisableRow(int id)
{
var connection = new CategoryDBEntities();
var record = connection.Categories.Find(id);
if (record == null) return;
record.state = false;
connection.SaveChanges();
}