Javascript 数据库未更新错误-实体框架

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&

我正在使用实体框架和JQuery来更新具有位数据类型的SQL表列中的值。这是通过将值读入html表,然后使用一个按钮来更改每行的位值来完成的

在这里您可以看到html表格:

    <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();
}