EF6 CurrentValues.SetValues将当前值更改为null

时间:2019-01-31 14:23:49

标签: c# sql-server entity-framework sql-update

我在Asp.net 4.5中使用带有C#的EF6。我想用新条目更新现有条目。例如:

            Customer customer = new Customer()
            {
                Address = txtAddress.Text,
                Name = txtName.Text,
                UserName = txtUserName.Text
            };
            if(Id==0)
            {
                //INSERT
                customer.Password = MyHelper.md5(txtPassword.Text);
                customer.CreatedDate = DateTime.Now;
                db.Customers.Add(customer);
            }
            else
            {
                //UPDATE
                Customer currentCustomer = db.Customers.FirstOrDefault(x => x.Id == Id);
                customer.Id = Id;

               if (!String.IsNullOrEmpty(txtPassword.Text))
                    customer.Password = MyHelper.md5(txtPassword.Text);

                db.Entry(currentCustomer).CurrentValues.SetValues(customer);
            }

它将插入新条目并成功更新地址,名称,用户名属性。但是在更新事件中,它将CreatedDate和Password字段更改为NULL。因为我没有再指定密码和创建日期字段。我希望EF在更新中跳过这些字段。但是据我了解,它假定这些字段为空。

是Bug,还是Entity Framework的功能。因此,如果我想用另一个条目更新一个条目,该怎么办?我必须再次指定所有值吗?

1 个答案:

答案 0 :(得分:0)

这是您的过程中的问题。 customer是新Customer的内存表示形式。您仅在.Password时定义.CreatedDateId==0,因此在更新例程中不可用。然后您的.SetValues(customer)声明将现有的currentCustomer.PasswordcurrentCustomer.CreatedDate设置为空

更新您的代码以仅更新您希望在customer中进行更新的currentCustomer中的属性。像这样:

//UPDATE
Customer currentCustomer = db.Customers.FirstOrDefault(x => x.Id == Id);
currentCustomer.Address = customer.Address;
db.Customers.Update(currentCustomer);

对于更清洁的方法,您可以完全修改为:

Customer c;
if(Id == 0) {
    c = new Customer(){ 
       Password = MyHelper.md5(txtPassword.Text),
       CreatedDate = DateTime.Now
    };
}
else
   c = db.Customers.FirstOrDefault(x => x.Id == Id);

if (c != null) {

    c = c{
        Address = txtAddress.Text,
        Name = txtName.Text,
        UserName = txtUserName.Text
    };
    if(Id != 0)
        db.Customers.Update(c);
    else
        db.Customers.Insert(c);

    db.SaveChanges();
}