当我单击表单中的按钮时,会创建一个新成员。 具有属性的新成员作为参数传递给数据库类 UpdateMember方法。
在UpdateMember方法中,搜索具有相同id的成员,然后将该位置上的成员替换为参数中传递的成员。
现在的问题是成员列表现在已更新,但context.SaveChanges与我不一致(它不会更新数据库)。
这是表单中的代码: db是Db类的实例
private void updateMember()
{
Member mbr = new Member();
mbr.membernr = int.Parse(nr.Text);
mbr.firstname = fName.Text;
mbr.lastname = lName.Text;
mbr.birthdate = Convert.ToDateTime(bDay.Text);
mbr.gender = gender.Text;
mbr.paid = int.Parse(paid.Text);
db.UpdateMember(mbr);
}
这是数据库类
class Db
{
private SportDBEntities context;
private static Db db;
private List<Member> members;
private Db() {
context = new SportDBEntities();
}
public static Db GetInstance() {
if (db == null) {
db = new Db();
}
return db;
}
public List<Member> GetMembers() {
members = new List<Member>();
GetMembersFromDb();
return members;
}
private void GetMembersFromDb() {
var query = context.Members;
foreach (Member m in query) {
members.Add(m);
}
}
public Member GetMemberAt(int index)
{
return members[index];
}
public void UpdateMember(Member mbr)
{
for (int i = 0; i < members.Count; i++)
{
if (members[i].membernr==mbr.membernr) {
members[i] = mbr;
}
}
context.SaveChanges();
}
}
答案 0 :(得分:1)
实际上,您没有从上下文更新实例,而是完全用存储在mbr变量中的未附加/瞬态对象替换它。
var existingMbr = members[i];
existingMbr.firstname = mbr.firstname;
existingMbr.lastname = mbr.lastname;
existingMbr.birthdate = mbr.birthdate ;
existingMbr.gender = mbr.gender;
existingMbr.paid = mbr.paid;
当跟踪 existingMbr 时,上下文应该检测到更改
BTW当您将敏感数据更新为 membernr 时,必须小心。它可能对您的业务具有重要意义。