Entity Framework Code First и совместное использование DataContext
Я использовал datacontext с шаблоном работы единицы с сервисным слоем. Этот сервисный слой делает несколько GETS с большим количеством включений для проверки существующих данных. Затем я делаю вставку в конце с коммитом единицы работы. Я продолжал получать эту ошибку:
Операция не выполнена: отношение не может быть изменено, так как одно или несколько свойств внешнего ключа не могут иметь значение NULL. Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален.
Если я сократил количество включений и сохранил вызов в отдельном текстовом тексте, вставка работает. Что-то происходит с моей вставкой и внешними ключами?
public void Save(int memberId, int? divisionId, DivisionGymCourtModel model)
{
ValidationProvider.Validate(model);
var item = new DivisionGymCourt();
if (model.Id > 0)
{
Expression<Func<DivisionGymCourt, object>> memberDivisionInclude = q => q.Division.Event.Members;
item = _divisionGymCourtRepository.Get(new[] { memberDivisionInclude }, q => q.Id == model.Id);
if (item == null)
throw new ValidationException(new NotFound("Division gym not found"));
item.Division.ValidatePermission(memberId);
if (model.GymCourt.Id != item.GymCourtId)
IsGymCourtInUse(memberId, item.DivisionId, model.GymCourt.Id);
}
else
{
IsGymCourtInUse(memberId, divisionId.Value, model.GymCourt.Id);
// _divisionsService.GetById(memberId, divisionId.Value); <!-- this was removed while the below division check was used. This call had some INCLUDES.
var division = _divisionsRepository.Get(null, q => q.Event.Members.Any(m => m.MemberId == memberId) && q.Id == divisionId.Value);
if(division == null)
throw new ValidationException(new NotFound("Division not found"));
item.DivisionId = divisionId.Value;
}
item.GymCourtId = model.GymCourt.Id;
item.Order = model.Order;
if (model.Id > 0)
_divisionGymCourtRepository.Update(item);
else
{
_divisionGymCourtRepository.Add(item);
}
UnitOfWork.Commit(); // <---- Erroring
model.Id = item.Id;
}