Entity Wrapper - Custom - PullRequest
       37

Entity Wrapper - Custom

0 голосов
/ 31 марта 2011

Я хотел бы найти обходной путь, чтобы выполнить простое решение для автоматизации определенных операций с помощью EF. Что мне нужно, так это захват во время сохранения и извлечения процесса для изменения результата запроса, но этот класс сможет заставить это работать для любых типов объектов.

Пример: у меня есть MyTestDb. Поэтому в моем проекте на C # я создаю новую модель сущности (MyTEstDbModel.edmx) с генерацией относительного класса POCO. Что ж, интересным может быть реализация нового пользовательского класса, подобного следующему:

class Example
{
   private ObjectContext _context;
   private Example(ObjectContext obj) { _context = obj; }

   public void Store(ObjectSet<???generic???> os)
   {
       // problem here: I dont't know the type contained in ObjectSet
       // but if I Knew its type, I could make a work like this:
       // -> foreach every instance in objectSet to check if exist some property 
       // via reflection, if i found them, then I set always the same values.
       // Why this? Because all my db contains some common filed 
       // like (createdByUser, TimeToUpdate, and so on..), so it wold be boring 
       // setting all those fileds from any point of program.
   }

public void Retrive(ObjectSet<???generic???> os)
{
   // here problem too: all my queries will be filtered by one or more value
   //  fileds, but I cannot use lambaExpression cos I don't Know the type 
   // contained in objectSet<..>
}
//....

наконец, в любой точке программы код должен выглядеть следующим образом:

Example obj = new Example(myEntityContext); //-> global

var result = myEntityContext.ObjectSetTyped.Where(..lambaExpression..condition)
result.someProperty = "...";
obj.Store(result); // store method will fill all other boring filed automatically.

Кто-нибудь может дать мне несколько советов, помощь, предложение по моей проблеме?

Заранее спасибо ...

Обновление

Теперь только еще одна проблема. Я бы отфильтровал мой ObjectSet с помощью метода получения следующим образом:

public void Retrieve<TEntity>(IQueryable<TEntity> ooo) where TEntity : IC
{
    ooo = ooo.Where(p => p.Filed == "MyDefaultValue");
}

Но из внешнего метода мой фильтр не влияет на результат objectSet. Как так ..?

MyEntities ent = new...
MyWrapper wrap = new MyWrapper();
wrap.Retrieve(ent.Users);

// проблема здесь -> пользователи ObjectSet всегда одинаковы ..

Ответы [ 2 ]

1 голос
/ 31 марта 2011

Определите интерфейсы, которые позволят вам сделать это. Например:

public interface IEntity
{
  DateTime CreatedAt { get; set; }
  string CreatedBy { get; set; }
}

Вам необходимо «внедрить» этот интерфейс в ваши сущности. Например, вы можете либо изменить объекты, генерирующие шаблоны T4, либо реализовать их в частичном классе. Оба свойства должны быть уже определены в модели, поэтому реализация является только декларативной:

public partial class MyEntity : IEntity // That's all
{ }

Теперь вы можете определить Store как:

public void Store<TEntity>(TEntity entity) where TEntity : IEntity
{
  ...
}

То же самое можно сделать с запросом, но вы можете, например, определить собственный метод расширения:

public static IQueryable<TEntity> GetUserEntities(this IQueryable<TEntity> query, string user) 
    where TEntity : IEntity 
{
   return query.Where(e => e.CreatedBy == user);
}

Вы просто определите свой запрос как:

var result = myEntityContext.MyEntities.GetUserEntities("someName");

Другой подход - просто определить GetQuery в вашем пользовательском контексте:

public IQueryable<T> GetQuery<T>() where T : IEntity
{
    var query = GetObjectSetSomehow;
    return query.ApplyGlobalConditions(); // Just another extension with your conditions
}

Я не большой поклонник шаблона репозитория, но обычно то, что вы пытаетесь сделать, близко к универсальному репозиторию, поэтому проверьте, например, этот пост . Это всего лишь пример, который можно расширить.

0 голосов
/ 01 апреля 2011

да, я просто хочу универсальный подход, аналогично, я понял с набором данных и датируемыми ... но это кажется невозможным достичь ..

.. эммм .. однако, позвольте мне показать вам следующий фрагмент кода,динамическое ключевое слово выглядит как что-то для надежды ... может быть, я в курсе решения ..?

    public ObjectSet<dynamic> Retrieve(string entity, string context)
    {
        Type myObjectContextType = Type.GetType(context);            
        ConstructorInfo cs = myObjectContextType .GetConstructor(new Type[] { });
        dynamic myObjContext = cs.Invoke(new object[] { });

        Type t = Type.GetType(entity);
        ConstructorInfo xi = t.GetConstructor(new Type[] { });
        dynamic UserEntity = xi.Invoke(new object[] { });

        !problem here!
        ObjectSet<?????> os = myObjContext.UserEntity.Where(...) 

        return ...           

    }

Я очень удивлен .. EF - отличный инструмент для более эффективного развития, но слишком мало"generalizalbe"

...