Для всех ваших трех вопросов я бы порекомендовал вам реализовать шаблон UnitOfWork. Я обычно использую IUnitOfWork
, который является частью моих репозиториев. Когда я хочу работать с более чем одним из моих репозиториев, я внедряю (один и тот же) UnitOfWork во все, с чем я хочу работать (это один из способов, которые я предпочитаю). Затем, когда вся работа завершена, я вызываю Commit () в моем UnitOfWork, который выполняет изменения в контексте структур сущностей. UnitOfWork - это оболочка для контекста структур сущностей .
Вопрос первый: Реляционные проверки выполняются базой данных. Если что-то не получится, сущностная структура вызовет исключение, и вы должны обработать это на более высоком уровне приложения, давайте назовем его сервисным уровнем, где вы работаете с UnitOfWork.
Вопрос второй: Использовать шаблон UnitOfWork.
Вопрос третий: Вам следует использовать отложенную загрузку, если вы не хотите загружать все дерево объектов.
Repository:
public interface IRepository<T>
{
IUnitOfWork UnitOfWork { get; set; }
IQueryable<T> All();
void Delete(T item);
void Save(T item);
void Update(T item);
IQueryable<T> Find(Func<T, bool> expression);
void Attach(T item);
}
UnitOfWork:
public interface IUnitOfWork : IDisposable
{
ObjectContext Context { get; set; }
void Commit();
bool LazyLoadingEnabled { get; set; }
bool ProxyCreationEnabled { get; set; }
string ConnectionString { get; set; }
}
ИЛИ здесь очень простая реализация шаблона UnitOfWork , чтобы вы начали (Это немного отличается от того, что я описал, так как UnitOfWork содержит репозитории, мой - наоборот).