При вызове SaveChanges получено исключение «Не удается вставить значение NULL в столбец« XXXXX » - PullRequest
1 голос
/ 20 сентября 2010

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

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

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, чтобы быть уверенным.

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

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

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

0 голосов
/ 20 сентября 2010

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

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