Entity Framework 4.1 общий репозиторий - PullRequest
4 голосов
/ 04 октября 2011

Используя Entity Framework 4.1 и пытаюсь создать слой репозитория выше в качестве теста.По сути, я играю с этим, чтобы познакомиться, так как я новичок в Entity Framework и шаблоне репозитория.Я следовал некоторым учебникам и создал общий репозиторий.Репозиторий инициируется так:

CentralDataRepositoryEntities CentralDataRepositoryEntities = new CentralDataRepositoryEntities();

Repository<Group> Rep = new Repository<Group>(CentralDataRepositoryEntities);
IEnumerable<Group> Groups = Rep.Get<Group>(g => g.JorMGroupId == 114);

Console.WriteLine(Group.Single());

Repository<Job> Rep1 = new Repository<Job>(CentralDataRepositoryEntities);
IEnumerable<Job> Jobs = Rep1.Get<Job>(j => j.jobId == 2138);

Console.WriteLine(Job.Single());

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

Repository Rep = new Repository(CentralDataRepositoryEntities);
IEnumerable<Group> Groups = Rep.Get<Group>(g => g.JorMGroupId == 114);
IEnumerable<Job> Jobs = Rep.Get<Job>(j => j.jobId == 2138);

Это хорошая идея?Зачем вам создавать отдельный репозиторий для каждого типа и какова производительность при создании нескольких репозиториев?

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Наличие такого хранилища нарушит Принцип единой ответственности .Один репозиторий должен отвечать только за управление сущностью одного типа.

Этот универсальный шаблон репозитория будет работать только для простых сценариев.Будет случай, когда вам понадобится дополнительный метод в хранилище для конкретных сущностей.

1 голос
/ 04 октября 2011

Просто для пояснения: вы пытаетесь создать «универсальный» репозиторий, который может использоваться несколькими ORM, или это только для EF?Если последнее, то это пустая трата времени, поскольку такой шаблон уже реализован.DbContext - это то, что вы бы назвали «Единицей работы», а метод Set, который он предоставляет, - это создание Repository для указанного типа.

Пример:

using(var ctx = new MyContext()) // Unit of Work
{
    var userRepository = ctx.Set<User>(); // Creates user repository
    var logRepository = ctx.Set<Log>(); // Creates log repository
    userRepository.Add(newUser); // Adds a "pending" item to the userRepository
    logRepositor.Add(logMsg); // Adds a "pending" item to the logRepository

    ctx.SaveChanges(); // Adds the "pending" items all at once.
}

под ожиданием я имею в виду, что изменения еще не сохранены в базе данных.

...