У меня есть приложение, в котором человек, который разработал приложение, использовал dbml для управления классами db. Но у нас есть другая база данных, с которой нам часто приходится подключаться, и мы обычно используем ado.net для подключения к ней, поскольку мы не можем использовать для нее тот же dbml. Однако мне лично не нравится использовать базу данных LINQ, поскольку сгенерированный автоматический код вызывает ошибки всякий раз, когда мы добавляем новую таблицу или свойство.
Я пытался реализовать шаблон репозитория с самопровозглашенными классами для сопоставления каждой таблицы, но для управления операциями в каждой таблице нам нужен отдельный репозиторий для каждого объекта. Я не уверен, если я нахожусь на правильном пути, используя этот шаблон, но если я не буду использовать EF в этом случае, можем ли мы создать общий репозиторий для представления общих операций или просто создать отдельный репозиторий для каждого создаваемого нами объекта?
Кроме того, для общего репозитория я был бы признателен, если бы мог получить к нему пример или указатели.
Извините, если я чувствую себя излишним. Заранее спасибо!
Общий репозиторий - хорошая идея, если вы просто используете 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 и все еще может использовать один и тот же репозиторий
EF
IDbSet<T>
вместо собственного репозитория.