Здесь у вас есть простой пример для чистого сценария CRUD. Создайте интерфейс, который будет содержать общие свойства для ваших запросов. Реализуйте этот интерфейс во всех ваших классах сущностей. Чем создать хранилище. Репозиторий обычно определяется как универсальный, но в вашем случае я определил каждый метод как универсальный, чтобы вы могли использовать один и тот же набор ресурсов для всех сущностей.
public interface IWellKnownEntity
{
int Type { get; set; }
}
public class Repository
{
public T GetEntityByWellKnownQuery<T>() where T : IWellKnownEntity
{
using (var context = new MyContext())
{
return context.CreateObjectSet<T>().FirstOrDefault(e => e.Type == 1);
}
}
public IEnumerable<T> GetEntitiesByCustomQuery<T>(Expression<Func<T, bool>> where)
{
using (var context = new MyContext())
{
return context.CreateObjectSet<T>().Where(where).ToList();
}
}
public void Create<T>(T entity) where T : IWellKnownEntity
{
using (var context = new MyContext())
{
context.AddObject(entity);
context.SaveChanges();
}
}
public void Update<T>(T entity) where T : IWellKnownEntity
{
using (var context = new MyContext())
{
context.Attach(entity);
context.ObjectStateManager.ChageObjecState(entity, EntityState.Modified);
context.SaveChanges();
}
}
public void Delete<T>(T entity) where T : IWellKnownEntity
{
using (var context = new MyContext())
{
context.Attach(entity);
context.DeleteObject(entity);
context.SaveChanges();
}
}
}
Чем вы предполагаете, что у вас есть продукт и каталог сущностей, которые обеспечивают хорошо известный интерфейс. Вы можете просто позвонить:
var repository = new Repository();
var product = repository.GetEntityByWellKnownQuery<Product>();
product.Name = "Updated";
repository.Update<Product>(product);
var category = repository.GetEntitiesByCustomQuery<Category>(c => c.Id == 1).First();
repository.Delete<Category>(category);
Вы можете еще улучшить пример кода. Этот код не использует общий контекст, поэтому он более пригоден для автономного сценария (веб-приложения). Если вы используете подключенный сценарий, такой как приложение WinForms или пакетное приложение, вы можете реализовать IDisposable в хранилище и делиться контекстом между всеми методами. Метод Dispose для хранилища поможет избавиться от контекста. Методы Code для Update и Delete будут другими, потому что нет необходимости прикреплять объект обратно к контексту или устанавливать состояние объекта.