Проверка отдельных полей на предмет изменений в EntityState - PullRequest
0 голосов
/ 08 марта 2012

В нашей базе данных есть пользователь.Пользователь может иметь определенные метаданные (например, их местоположение, возраст и т. Д.), Связанные с ними.В дополнение к этому у них есть изображение профиля.Пользователь может отредактировать любую из этих вещей в любое время.

enter image description here

Проблема, с которой мы сталкиваемся, заключается в том, что когда пользователь собирается редактировать свою информацию, но он не выбираетизображение - предыдущее изображение стирается (Null).

Я полагаю, что когда мы собираемся сохранить измененного пользователя, мы должны иметь возможность сказать if(user.profileImage == null) don't save it

Я полагаю, что он вступит в игру в нашем хранилище пользователей, которое использует следующий код:

public void SaveUser(Domain.Entities.User user)
        {
            if (user.UserId == 0)
            {
                context.Users.Add(user);
            }
            else
            {
                context.Entry(user).State = EntityState.Modified;
                //The logic would be here
            }
            context.SaveChanges();
        }

Однако мне кажется, что независимо от того, что мы пытаемся, это не работает.

Итак, мой вопрос: есть ли способ проверить изменения отдельных полей вместо всего EntityState?

Ответы [ 2 ]

0 голосов
/ 01 мая 2012

Я закончил хранить данные изображения в сеансе, а затем, если загрузка изображения была нулевой, я просто вставил атрибут сеанса в мое изображение, фактически сохранив старое изображение, если оставить его пустым.

Session["image"] = productService.GetProduct(id).Image;

Тогда в посте я сказал ...

if (image != null)
                {
                    product.ImageType = image.ContentType;
                    product.Image = new byte[image.ContentLength];
                    image.InputStream.Read(product.Image, 0, image.ContentLength);
                }
                else
                {
                    product.Image = (byte[])Session["image"];
                }
0 голосов
/ 08 марта 2012

Да, есть способ:

context.Users.Attach(user);
context.Entry(user).Property(u => u.Location).IsModified = true;
context.Entry(user).Property(u => u.Age).IsModified = true;
// etc.

Имейте в виду, что вы не можете установить IsModified на false, если свойство помечено как измененное. Итак, как-то так ...

context.Entry(user).State = EntityState.Modified;
context.Entry(user).Property(u => u.Image).IsModified = false;

... не работает .

Редактировать Альтернативное решение:

public void SaveUser(Domain.Entities.User user)
{
    if (user.UserId == 0)
    {
        context.Users.Add(user);
    }
    else
    {
        var userInDb = context.Users.Single(u => u.UserId == user.UserId);

        if (user.profileImage == null)
            user.profileImage = userInDb.profileImage;

        context.Entry(userInDb).CurrentValues.SetValues(user);
    }
    context.SaveChanges();
}

Сохраняет значение profileImage, как в базе данных, если пользователь не опубликовал новое изображение (= user.profileImage == null), в противном случае оно сохраняет новое изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...