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