Каковы некоторые рекомендации по обработке проверки сущностей домена, которые зависят от других сущностей домена, использующих POCO, которые создаются при реализации ORM на основе кода EF First?
Вот ситуация, в которой я пытаюсьПроработайте: у меня есть класс, который представляет клиентский компьютер, и есть свойство этого класса, которое представляет IP-адрес компьютера.Мне нужно, чтобы это было уникальным, но я не могу найти элегантное решение для обеспечения этого ограничения.В настоящее время я делаю это на сервисном уровне, где я обновляю / вставляю сущность.
- UPDATE -
Я знаю, что EF не поддерживает уникальные ограничения, и я уже добавил ограничениек таблице базы данных, но я бы предпочел поймать ограничение, прежде чем я попаду в базу данных.То, что я искал, было лучшим способом обработки проверки, который зависит от других объектов в целом и использовал в качестве примера ограничение уникальности.
- ОБНОВЛЕНИЕ 28.03.2010 -
Для справки, вот как я сейчас работаю с уникальным ограничением для IP (_unitOfWork имеет тип SqlMessageUnitOfWork: в основном он оборачивается вокруг используемого мной DBContext, предоставляя IDbSets для всех соответствующих таблиц):
public class ClientService : IClientService
{
public ValidationResult InsertClient(ClientDTO clientDTO)
{
var existingClient = _unitOfWork.Clients.Where(x => x.IP == clientDTO.IP).SingleOrDefault();
if (existingClient != null)
{
return new ValidationResult("IP already in Use.", new[] { "IP" });
}
else
{
var newclient = new Client();
ClientEntityMapper.MapToEntity(clientDTO, newclient, _unitOfWork.Terminals);
_unitOfWork.Clients.Add(newclient);
_unitOfWork.Commit();
}
return ValidationResult.Success;
}
...
private IUnitOfWork _unitOfWork;
public ClientService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
}
public interface IUnitOfWork
{
IDbSet<Message> Messages { get; }
IDbSet<Terminal> Terminals { get; }
IDbSet<Client> Clients { get; }
IDbSet<MessageDisplayInstance> MessageDisplayInstances { get; }
void Commit();
}
public class SqlMessageUnitOfWork : IUnitOfWork
{
readonly VisualPagingDbContext _context;
public SqlMessageUnitOfWork()
{
_context = new VisualPagingDbContext();
}
public void Commit()
{
_context.SaveChanges();
}
public IDbSet<Message> Messages
{
get { return _context.Messages; }
}
public IDbSet<Terminal> Terminals
{
get { return _context.Terminals; }
}
public IDbSet<Client> Clients
{
get { return _context.Clients; }
}
public IDbSet<MessageDisplayInstance> MessageDisplayInstances
{
get { return _context.MessageDisplayInstances; }
}
}