Я использую классы POCO в проекте EF4 CTP5, и у меня возникают проблемы при удалении дочерних свойств. Вот мой пример (надеюсь, не слишком длинный).
Соответствующие части класса тура
public partial class Tour
{
public Guid TourId { get; private set; }
protected virtual List<Agent> _agents { get; set; }
public void AddAgent(Agent agent)
{
_agents.Add(agent);
}
public void RemoveAgent(Guid agentId)
{
var a = Agents.Single(x => x.AgentId == agentId);
_agents.Remove(Agents.Single(x => x.AgentId == agentId));
}
}
Командный обработчик
public class DeleteAgentCommandHandler : ICommandHandler<DeleteAgentCommand>
{
private readonly IRepository<Core.Domain.Tour> _repository;
private readonly IUnitOfWork _unitOfWork;
public DeleteAgentCommandHandler(
IRepository<Core.Domain.Tour> repository,
IUnitOfWork unitOfWork
)
{
_repository = repository;
_unitOfWork = unitOfWork;
}
public void Receive(DeleteAgentCommand command)
{
var tour = _repository.GetById(command.TourId);
tour.RemoveAgent(command.AgentId);
// The following line just ends up calling
// DbContext.SaveChanges(); on the current context.
_unitOfWork.Commit();
}
}
Вот ошибка, которую я получаю, когда мой UnitOfWork вызывает DbContext.SaveChanges()
Операция завершилась неудачно: отношение не может быть изменено, поскольку одно или несколько свойств внешнего ключа не могут быть равны нулю. Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален.
Это происходит из-за того, что EF просто не удаляет сущность Agent автоматически из базы данных только потому, что он был удален из коллекции Agents в моем классе Tour.
Мне нужно явно позвонить dbContext.Agents.DeleteObject(a);
, но моя проблема в том, что у меня нет доступа к dbContext из моего POCO.
Есть ли способ справиться с этим сценарием?