Entity Framework 4, Динамический запрос - PullRequest
1 голос
/ 30 августа 2010

Возможно ли создать динамический запрос с Entity Framework. У меня 18 таблиц, каждая из которых имеет одинаковую структуру. Как я могу создать динамический запрос, чтобы использовать один и тот же запрос для каждой таблицы. Я хотел бы иметь общий запрос для создания чтения обновления удаления. Чтение содержит тот же пункт "Где". Спасибо за вашу помощь.

1 Ответ

1 голос
/ 30 августа 2010

Здесь у вас есть простой пример для чистого сценария 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 будут другими, потому что нет необходимости прикреплять объект обратно к контексту или устанавливать состояние объекта.

...