Как написать общее имя сущности в конструкторе в EF4? - PullRequest
1 голос
/ 14 декабря 2010

Я пытаюсь написать общий репозиторий в EF 4. Но мои коды выглядят не очень хорошо.Поскольку ExpressionEntities не является GENERIC.

Я хочу преобразовать следующие коды:

public class DataRepository<T> : IRepository<T> where T : class
{
    private ExpressionsEntities _context;
    public DataRepository()
    {
    }

    public DataRepository(ExpressionsEntities context)
    {
        _context = context;
    }
}

в следующее:

public class DataRepository<T> : IRepository<T> where T : class
{
    private GetGenericEntityCONTEXT _context;

    public DataRepository()
    {
    }

    public DataRepository(GetGenericEntityCONTEXT  context)
    {
        _context = context;
    }
}

, поскольку ExpressionsEntities не являются глобальными моими сущностями: ExpressionsEntities1,ExpressionsEntities 2, ExpressionsEntities 3 и т. Д. ... мне нужно написать получить взять объект, например:

public class DataRepository<T> : IRepository<T> where T : class
{
    private Entity _context;
    public DataRepository()
    {
    }

    public DataRepository(Entity context)
    {
        _context = context;
    }

    public class Main
    {
        main()
        {
            new DataRepository(ExpressionEntities)
        }
    }
}

Ответы [ 2 ]

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

Я предпочитаю получать имя сущности следующим образом.

EntityContainer container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);

EntitySetBase entitySet = container.BaseEntitySets.Where(item => item.ElementType.Name.Equals(typeof(T).Name)).FirstOrDefault();

var entityName = entitySet.Name

Это относится к некоторым случаям, если у вас есть несколько классов во множественном числе, а некоторые классы нет.

1 голос
/ 14 декабря 2010

Не уверен на 100%, что вы спрашиваете - насколько я понимаю, вы не можете динамически создать набор сущностей на основе T.

Ну, это достаточно просто:

public class DataRepository<T> : IRepository<T> where T : class
{
   private ObjectContext _ctx; 

   public DataRepository<T>(ObjectContext ctx)
   {
      this._ctx = ctx;
   }

   public IObjectSet<T> CurrentEntitySet<T>()
   {
       get
       {
          var entityName = _plularizer.Pluralize(typeof(T).Name);
          string entitySetName = string.Format("{0}.{1}", EntityContainerName, entityName);
          return _ctx.CreateObjectSet<T>(entitySetName );  
       }
   }
}

Тогда ваш определенный репозиторий может сделать это (например):

public class AppleRepository : DataRepository<Apple>
{
   public AppleRepository(IObjectContext ctx) : base(ctx) {}

   public ICollection<Apple> FindApples(Func<Apple,bool> predicate)
   {
      return CurrentEntitySet.Where(predicate).ToList();
   }
}

И когда вы создаете свой репозиторий, проходите через контекст объекта - предпочтительно через DI:

var repository = new AppleRepository(new ExpressionEntities()); // should be DI'ed

По сути, мы используем Pluralization (тот же код, который используется Entity Framework для множественного числа имен наборов сущностей) и CreateObjectSet<T>.

Таким образом, если вы создали DataRepository<Apple>, это переведет имя набора сущностей Яблоки (которое должно соответствовать набору сущностей вашей модели), и мы создадим основанный на этом объект.

Свойство EntityContainerName находится на вашем EDMX - вы должны передать его через ctor (желательно через DI).

Это отвечает на ваш вопрос?

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