Entity Framework 4 - не всегда обновляет логическое свойство, используя ApplyCurrentValues - PullRequest
6 голосов
/ 15 февраля 2010

У меня есть простая сущность для страны, которая создается Entity Framework 4 с использованием VS 2010 RC. Это выглядит примерно как POCO ниже.

public class Company
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string ISOCode { get; set; }
    public boolean Active { get; set; }
}

Код моего репозитория указан ниже. 'db' - это мой контекст, который инициализируется в конструкторе.

public void EditCountry(Country countryToEdit)
{
    db.Countries.Attach(new Country { ID = countryToEdit.ID });
    db.Countries.ApplyCurrentValues(countryToEdit);
    db.SaveChanges();
}

Изменение поля Active с false на true в countryToEdit приводит к следующему SQL

update [dbo].[Countries]
set [Name] = @0, [ISOCode] = @1, [Active] = @2
where ([ID] = @3)
@0 nvarchar(256),@1 nvarchar(12),@2 bit,@3 int,@0='Algeria',@1='DZ',@2=1,@3=4

Это ожидается.

Если я изменил поле Active с true на false в countryToEdit, будет получен следующий SQL

update [dbo].[Countries]
set [Name] = @0, [ISOCode] = @1
where ([ID] = @2)
@0 nvarchar(256),@1 nvarchar(12),@2 int,@0='Afghanistann',@1='AF',@2=1

Не предпринимается попытка обновить поле Active.

Ответы [ 2 ]

7 голосов
/ 17 февраля 2010

Этот ApplyCurrentValues ​​в EF 4 вопрос имеет ответ.

Это должно быть

db.Countries.Attach(db.Countries.Single(c => c.ID == countryToEdit.ID));

Если вы прикрепите пустой объект-заглушку, логические поля будут инициализированы как false. Вызов ApplyCurrentValues ​​не видит изменений в логическом значении между заглушкой и редактируемым объектом.

Приведенный выше код добавляет еще один запрос к БД, но я могу жить с этим.

0 голосов
/ 05 июня 2013

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

Пример:

public void EditCountry(Country countryToEdit)
{
    db.Countries.Attach(new Country 
    { 
         ID = countryToEdit.ID, 
         Active = !countryToEdit.Active  
    });
    db.Countries.ApplyCurrentValues(countryToEdit);
    db.SaveChanges();
}

Установка значения по умолчанию вашего логического значения, противоположного тому, что будет обновлено, помечает Entity Framework, что поле было обновлено.

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

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