C# 不更新数据库
我有以下两个由实体框架生成的类C# 不更新数据库,c#,wpf,entity-framework,C#,Wpf,Entity Framework,我有以下两个由实体框架生成的类 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 SampleDbCont
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; }
}
变量“dg”必须是databaseContext(代码中的“db”)DataGrid属性的一部分。例如:
foreach (CheckBox cb in myBoxes)
{
dg.IsChecked = cb.IsChecked;
db.DataGrids.Add(dg);
db.SaveChanges();
}
.SaveChanges()只会将分配给DataGrid属性的项刷新到数据库。根据您的评论,我不完全清楚是否需要每次创建复选框或只是更新复选框。如果创建,它将与另一个答案类似。但是,由于尝试添加新的Datagrid而未提供
名称
和位置
,因此可能会得到系统.Data.Entity.Validation.DbEntityValidationException
,它们不可为空,并且(可能)不会像Id
那样自动填充:
foreach (CheckBox cb in myBoxes)
{
Datagrid dg = new Datagrid
{
Name = "NameGoesHere"; // Maybe you're wanting to use cb.Name or cb.Text?
Location = "Location Here";
IsChecked = cb.IsChecked;
};
db.DataGrids.Add(dg);
db.SaveChanges();
}
如果您只是更新,我仍然不确定您在哪里设置了dg
,但您可能希望从以下位置查找:
foreach (CheckBox cb in myBoxes)
{
Datagrid dg = db.DataGrids.Where(g => g.Name == cb.Name).SingleOrDefault();
// etc.
根据评论进行编辑:
如果您正在进行双向绑定,并且已将
复选框直接绑定到数据网格实体的IsChecked
值,那么除了调用db.SaveChanges()之外,不需要做任何事代码>当您准备好保存时。绑定的Datagrid
实体将自行更新。每次如何设置dg
?我的应用程序中的Forevery复选框,我想将复选框值分配给数据库中的Ischecked,这是位值。谢谢。但是我得到了一个异常,例如EntityFramework.dll中出现了未处理的System.Data.Entity.Validation.DbEntityValidationException。请帮助。是不是因为数据库中可空类型不匹配..谢谢你的帮助。基本上我有一个listview控件,每行都有一个复选框。复选框的值(无论是否选中)来自上面提到的DataGrid类IsChecked属性。因此,在UI上,我有一个按钮和listview。因此,基本上,如果用户将任何复选框更改为选中或未选中,我希望将其选中的内容保存到数据库中(双向绑定)。我有代码来确定用户选中或取消选中了哪些复选框。我想保存这些更改。基本上使用实体框架更新数据库的IsChecked值。您的解决方案非常清晰,谢谢。。但是我不想编辑名称和位置列,因为它们不像你说的那样是空的。我只想更新IsChecked列,即为每行更新单个列。有没有一种方法可以做到这一点..补充到上面的答案--如果你真的在做双向绑定,只要确保它设置正确,然后你需要做的就是保存。无需再次跟踪所有复选框。
foreach (CheckBox cb in myBoxes)
{
Datagrid dg = db.DataGrids.Where(g => g.Name == cb.Name).SingleOrDefault();
// etc.