C# 实体框架更新失败

C# 实体框架更新失败,c#,sql-server,wpf,entity-framework,listview,C#,Sql Server,Wpf,Entity Framework,Listview,我有实体框架生成的类,如下所示 public partial class Datagrid { public int Id { get; set; } public string Name { get; set; } public string Location { get; set; } public Nullable<bool> IsChecked { get; set; } } public

我有实体框架生成的类,如下所示

public partial class Datagrid
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Location { get; set; }
        public Nullable<bool> IsChecked { get; set; }
    }



public partial class SampleDbContext : DbContext
    {
        public SampleDbContext()
            : base("name=SampleDbContext")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<Datagrid> Datagrids { get; set; }
    }
公共部分类数据网格
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串位置{get;set;}
公共可空IsChecked{get;set;}
}
公共部分类SampleDbContext:DbContext
{
公共SampleDbContext()
:base(“name=SampleDbContext”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
抛出新代码FirstException();
}
公共虚拟数据库集数据网格{get;set;}
}
我有一个Wpf应用程序,其中每行有一个包含复选框的listview。我已经编写了代码来检索buttonclick上复选框的值。当我尝试使用复选框的选定值更新数据库时,它不会执行任何操作。请帮助..这是一段代码..同样,复选框中的所有选择工作正常..我只想用用户在前端复选框中选中的值更新数据库中的Ischecked值。因此,我正在协助dg以避免验证错误

 try
        {
            int i = 0;
            IEnumerable<CheckBox> myBoxes = FindVisualChildren<CheckBox>(this);
            foreach (CheckBox cb in myBoxes)
            {
                Datagrid dg = db.Datagrids.ToList()[i];
                dg.Id=dg.Id;
                dg.Name = dg.Name;
                dg.Location = dg.Location;
                dg.IsChecked = cb.IsChecked;
                db.Datagrids.Add(dg);
                db.SaveChanges();

                i++;
            }
        }
        catch (Exception ex)

        {
            MessageBox.Show(ex.Message);
        }
}
试试看
{
int i=0;
IEnumerable mybox=FindVisualChildren(this);
foreach(MyBox中的复选框cb)
{
Datagrid dg=db.Datagrids.ToList()[i];
dg.Id=dg.Id;
dg.Name=dg.Name;
危险品位置=危险品位置;
dg.IsChecked=cb.IsChecked;
db.Datagrids.Add(dg);
db.SaveChanges();
i++;
}
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}

首先,这一行似乎可疑:

dg.Id=dg.Id;
我想这只是个打字错误。如果是这样的话,最好在问题中加入实际的代码行

如果不是问题,那么尝试为
id
字段设置一个键属性(即使您需要自己的id,也可以尝试一下,这样如果它起作用,您就有了解决问题的起点):

然后,删除可疑(输入错误?)行:


另一种方法,它不能解决您的问题,但值得尝试。这句话是:

db.Entry(dg).State = System.Data.EntityState.Added;
而不是:

db.Datagrids.Add(dg);

所以你没有任何例外?也许您的web.config的连接字符串错误地指向了另一个数据库/实例?这种情况经常发生在我身上。你的代码没有任何意义,因为你说你想从数据库中更新一个值,但你正在获取该值,然后使用它。添加它,它标记要创建/插入的实体,而不是更新。另一件事,你的代码不会很快,因为你正在使用行对数据库进行不成功的查询db.Datagrids.ToList()[i]此行首先从datatable Datagrids中获取所有条目,但您只对某个索引感兴趣。我建议阅读一些关于EF如何正确使用的教程。我同意这不是一种有效的方法。。我试着走MVVM的路。我已经创建了一个新的分部类,并通过在setter块中指定OnPropertyChanged(“IsChecked”)对IsChecked属性进行了自定义。在视图级别,我要感谢您的帮助。首先,我有一个错误的连接字符串,然后我修改了我的代码,只是说db.savechanges()而不是一切..它工作了。。
db.Entry(dg).State = System.Data.EntityState.Added;
db.Datagrids.Add(dg);