实体框架更新失败

时间:2014-09-19 19:52:33

标签: 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 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; }
    }

我有一个Wpf应用程序,其中我有一个包含每行复选框的列表视图。我编写了代码以在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);
        }
}

1 个答案:

答案 0 :(得分:0)

首先,这条线似乎很可疑:

dg.Id=dg.Id;

我猜这只是一个错字。如果是这样,那么将实际的代码行放在你的问题中会更好。

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

[Key]
public int Id { get; set; }

然后,删除可疑(拼写错误?)行:

dg.Id=dg.Id;

另一种方式,它无法解决您的问题,但值得尝试。把这一行:

db.Entry(dg).State = System.Data.EntityState.Added;

而不是:

db.Datagrids.Add(dg);