2010-09-19 1 views
1

У меня есть приложение, которое создает сущности в автономном режиме, а затем сохраняет их в базу данных, когда она доступна. Многие объекты могут быть созданы, когда приложение находится в автономном режиме.При вызове «SaveChanges», получающего исключение «Невозможно вставить значение NULL в столбец« XXXXX »«

Вот основной вариант метода:

public void SaveEntityToDatabase(Entity entity)    
{ 
    Context.Entities.AddObject(entity); 
    Context.SaveChanges(); 
} 

Поскольку эти объекты создаются на форуме не существует никакого способа узнать, есть ли существующие объекты с аналогичными данными. Например, у меня есть поле «SomeText», которое должно быть уникальным для всех записей. Это поле является типом «текст» в SQL Server, поэтому вместо того, чтобы пытаться напрямую сравнить значение, которое я использую его, и сравнить значение хэша. Если нет совпадающих записей, я иду вперед и добавляю новый объект, иначе я рано выйду из метода.

Вот базовая версия обновленного метода:

public void SaveEntityToDatabase(Entity entity)    
{ 
    var hashedValue = entity.SomeText.ToSHA1(); 

    if (Context.Entities.Where(e => e.SomeTextHash == hashedValue).Count() > 0) 
     return; 

    entity.SomeTextHash = hashedValue; 

    Context.Entities.AddObject(entity); 
    Context.SaveChanges(); 
} 

К сожалению, делает проверки существования вызывает мое приложение, чтобы бросить исключение:

Cannot insert the value NULL into column 'SomeText'. 

Комментирование чек фиксирует проблему, но Безразлично «Позвольте мне проверить существующие записи.

//if (Context.Entities.Where(e => e.SomeTextHash == hashedValue).Count() > 0) 
    //return; 

Если я вставляю точку останова в SaveChanges и проверяю «объект», если он полностью заполнен. Кажется, что проверка существования является недействительной «сущностью» в графе объектов, но я недостаточно осведомлен о внутренней работе Entity Framework.

Что вызывает это исключение и как я могу его избежать?

+1

Вы пробовали запустить профиль запроса? Кажется, что linq делает за кулисами? – PostMan

+1

Кроме того, вы можете использовать 'Entities.Any (e -> e.SomeTextHash ...' – PostMan

ответ

0

В конечном счете, похоже, что проверка проверила мой контекст. Мне нужно было отследить мои изменения отдельно, а затем добавить объект после проверки проверки hashvalue.

0

Почему бы просто не создать уникальный индекс в столбце SomeTextHash, и если исключение типа «не может вставить дубликат бла-бла» вызывается, проглотите его?

+4

Три причины: 1. Чтобы быть лучшим программистом, мне нравится полностью понимать, почему такие вещи случаются. 2. Я ненавижу обходные пути если они абсолютно не могут быть исключены. 3. Я стараюсь не использовать исключения для общего управления потоком. –

+0

Хотя я полностью согласен с вами во всех вышеперечисленных пунктах, я также не согласен с подходом, который вы приняли в своем первоначальном вопросе, поскольку это выглядит так: обходной путь для того, чтобы не использовать Хранимый Proc. Хранение хеша в базе данных с использованием индекса и с SP, который возвращает значение бита на основе if, было бы быстрее и масштабироваться лучше, чем сырой цикл над данными. –

+0

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

Смежные вопросы