context.SaveChanges()不会工作

时间:2015-12-30 14:16:07

标签: c# entity-framework

当我单击表单中的按钮时,会创建一个新成员。 具有属性的新成员作为参数传递给数据库类 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();
    }
}

1 个答案:

答案 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 时,必须小心。它可能对您的业务具有重要意义。