У меня есть приложение, которое создает сущности в автономном режиме, а затем сохраняет их в базу данных, когда она доступна. Многие объекты могут быть созданы, когда приложение находится в автономном режиме.При вызове «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.
Что вызывает это исключение и как я могу его избежать?
Вы пробовали запустить профиль запроса? Кажется, что linq делает за кулисами? – PostMan
Кроме того, вы можете использовать 'Entities.Any (e -> e.SomeTextHash ...' – PostMan