EF6 CurrentValues.SetValues ​​меняет текущие значения на ноль - PullRequest
0 голосов
/ 31 января 2019

Я использую EF6 с C # в Asp.net 4.5.Я хочу обновить существующую запись новой записью.Например:

            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);
            }

Он вставляет новую запись и успешно обновляет свойства Address, Name, UserName.Но в событии обновления он изменяет поля CreatedDate и Password на NULL.Потому что я не указал поля Password и CreatedDate снова.Я хочу, чтобы EF пропустил эти поля при обновлении.Но, как я понимаю, он принимает эти поля как пустые.

Это ошибка или особенность Entity Framework.Итак, что мне делать, если я хочу обновить запись другой записью?Нужно ли снова указывать все значения?

1 Ответ

0 голосов
/ 31 января 2019

Это проблема вашего процесса.customer является представлением в памяти нового Customer.Вы определяете .Password и .CreatedDate только тогда, когда Id==0, поэтому он недоступен во время процедуры обновления.И тогда ваше объявление .SetValues(customer) устанавливает для существующих currentCustomer.Password и currentCustomer.CreatedDate значение null

Обновите ваш код, чтобы обновлять только те свойства из 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...