Можем ли мы использовать общий репозиторий без использования EF? Это хорошая практика?

1

У меня есть приложение, в котором человек, который разработал приложение, использовал dbml для управления классами db. Но у нас есть другая база данных, с которой нам часто приходится подключаться, и мы обычно используем ado.net для подключения к ней, поскольку мы не можем использовать для нее тот же dbml. Однако мне лично не нравится использовать базу данных LINQ, поскольку сгенерированный автоматический код вызывает ошибки всякий раз, когда мы добавляем новую таблицу или свойство.

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

Кроме того, для общего репозитория я был бы признателен, если бы мог получить к нему пример или указатели.

Извините, если я чувствую себя излишним. Заранее спасибо!

  • 0
    Я бы создал общий репозиторий. Если некоторые сущности не требуют больше, чем базовый CRUD, то создание отдельного класса для каждого, на мой взгляд, бессмысленно. И - репозиторий - это нормально, без EF - База данных - это только один из способов сохранения данных. Вы также можете создать репо, который работает на XML, JSON на другом.
  • 0
    да, именно так я и думал вначале ... но я изо всех сил пытался создать правильный класс для определения этих операций. Все примеры, которые я нашел, использовали EF только для реализации шаблона хранилища. Можете ли вы предоставить пример для реализации общего репозитория, который я могу реплицировать и настроить соответствующим образом.
Показать ещё 1 комментарий
Теги:
linq
entity-framework
repository-pattern
dbml

1 ответ

0

Общий репозиторий - хорошая идея, если вы просто используете CRUD-операции, (Create, Read, Update и Delete) для меня, мне не нравится многое, чтобы генерировать объекты базы данных через DBML, я обычно пишу сущности и их сопоставления вручную, здесь, в некоторых примерах проекта, над которым я работаю

сначала модель

public class Operator
{
    public virtual string OperatorName { get; set; }

    public virtual string LoginName { get; set; }

    public virtual string Email { get; set; }

    public virtual string PhoneNo { get; set; }

    public virtual short Status { get; set; }

    public virtual byte[] Password { get; set; }
}

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

public interface IGenericContext
{
    void Add<T>(T entity)
        where T : class;

    void Update<T>(T entity)
        where T : class;

    void Delete<T>(T entity)
        where T : class;

    IQueryable<T> GetIQueryable<T>()
        where T : class;
}

здесь образец контекста EF, который реализует интерфейс IGenericContext

public class EFContext : DbContext, IGenericContext
{
    public EFContext(string connectionName)
        : base(connectionName)
    {

    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.AddFromAssembly(this.GetType().Assembly);
        base.OnModelCreating(modelBuilder);
    }

    public void Add<T>(T entity) where T : class
    {
        this.Set<T>().Add(entity);

        this.SaveChanges();
    }

    public void Update<T>(T entity) where T : class
    {
        this.Set<T>().Attach(entity);
        this.Entry(entity).State = EntityState.Modified;

        this.SaveChanges();
    }

    public void Delete<T>(T entity) where T : class
    {
        this.Set<T>().Attach(entity);
        this.Set<T>().Remove(entity);

        this.SaveChanges();
    }

    public IQueryable<T> GetIQueryable<T>() where T : class
    {
        return this.Set<T>();
    }
}

для EF вам нужно будет сделать сопоставления самостоятельно, как показано ниже

public class OperatorMapping : EntityTypeConfiguration<Operator>
{
    public OperatorMapping()
    {
        this.ToTable("Operators");
        this.Property(t => t.OperatorName).IsRequired().HasColumnName("OperatorName");
        this.HasKey(t => t.LoginName).Property(t => t.LoginName).HasColumnName("LoginName");
        this.Property(t => t.Email).IsRequired().HasColumnName("Email");
        this.Property(t => t.PhoneNo).HasColumnName("PhoneNo");
        this.Property(t => t.Status).IsRequired().HasColumnName("Status");
        this.Property(t => t.Password).IsRequired().HasColumnName("Password");
    }
}

то общий репозиторий, этот репозиторий будет использовать IGenericContext вместо работы с EF DBContext

public class Repository<TEntity>
    where TEntity : class, new()
{
    protected IGenericContext Context { get; set; }

    public Repository(IGenericContext context)
    {
        Context = context;
    }

    public void Add(TEntity entity)
    {
        Context.Add(entity);
    }

    public void Update(TEntity entity)
    {
        Context.Update(entity);
    }

    public void Delete(TEntity entity)
    {
        Context.Delete(entity);
    }

    public List<TEntity> ToList()
    {
        return Context.GetIQueryable<TEntity>().ToList();
    }
}

все, что вам нужно сделать, это создать DBContext, передать его в общий репозиторий и выполнить ваши операции

IGenericContext context = new EFContext("Infrastructure");
Repository<Operator> repository = new Repository<Operator>(context);
var operators = repository.ToList();

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

  • 0
    Я думал, что ОП хочет пример, который не основан на EF
  • 0
    Предоставляя IQueryable, вы будете полагаться на специфическое поведение EF, которое может или не может быть доступно у другого поставщика. Вы можете использовать IDbSet<T> вместо собственного репозитория.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню