我在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的功能。因此,如果我想用另一个条目更新一个条目,该怎么办?我必须再次指定所有值吗?
答案 0 :(得分:0)
这是您的过程中的问题。 customer
是新Customer
的内存表示形式。您仅在.Password
时定义.CreatedDate
和Id==0
,因此在更新例程中不可用。然后您的.SetValues(customer)
声明将现有的currentCustomer.Password
和currentCustomer.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();
}