我已经得到了更新我的EF的DataContext如下通用库(简称为简洁起见):C#泛型类V5接口
public interface IRepository<T> where T : class
{
void Add(T entity);
void Update(T entity);
void Delete(T entity);
IQueryable<T> Find(Expression<Func<T, bool>> filter = null);
}
public class Repository<TEntity, TContext> : IRepository<TEntity>
where TEntity : class
where TContext : DbContext
{
public IUnitOfWork UnitOfWork { get; set; }
public TContext DataContext { get; set; }
public Repository(IUnitOfWork unitOfWork, TContext dataContext)
{
UnitOfWork = unitOfWork;
DataContext = dataContext;
}
public virtual void Add(TEntity entity)
{
DataContext.Set<TEntity>().Add(entity);
}
public virtual void Update(TEntity entity)
{
DataContext.Set<TEntity>().Attach(entity);
DataContext.Entry(entity).State = EntityState.Modified;
}
public virtual void Delete(TEntity entity)
{
if (DataContext.Entry(entity).State == EntityState.Detached)
DataContext.Set<TEntity>().Attach(entity);
DataContext.Set<TEntity>().Remove(entity);
}
public IQueryable<TEntity> Find(System.Linq.Expressions.Expression<Func<TEntity, bool>> filter = null)
{
IQueryable<TEntity> query = DataContext.Set<TEntity>();
if (filter != null)
query = query.Where(filter);
return query;
}
}
我想创建一个IArchiveOnlyRepository使用与实现我的IArchiveable接口实体。我希望这会工作:
public interface IArchiveable
{
bool IsArchived { get; set; }
DateTime? ArchivedOn { get; set; }
string ArchivedBy { get; set; }
}
public interface IArchiveOnlyRepository<T> where T : IArchiveable
{
void Add(T entity);
void Update(T entity);
void Archive(T entity);
IQueryable<T> Find(Expression<Func<T, bool>> filter = null);
}
public class ArchiveOnlyRepository<TEntity, TContext> : IArchiveOnlyRepository<TEntity>
where TEntity : IArchiveable
where TContext : DbContext
{
public IUnitOfWork UnitOfWork { get; set; }
public TContext DataContext { get; set; }
public ArchiveOnlyRepository(IUnitOfWork unitOfWork, TContext dataContext)
{
UnitOfWork = unitOfWork;
DataContext = dataContext;
}
public virtual void Add(TEntity entity)
{
DataContext.Set<TEntity>().Add(entity);
}
public virtual void Update(TEntity entity)
{
DataContext.Set<TEntity>().Attach(entity);
DataContext.Entry(entity).State = EntityState.Modified;
}
public virtual void Archive(TEntity entity)
{
if (DataContext.Entry(entity).State == EntityState.Detached)
DataContext.Set<TEntity>().Attach(entity);
entity.IsArchived = true;
entity.ArchivedOn = DateTime.UtcNow;
entity.ArchivedBy = UnitOfWork.UserName;
}
public IQueryable<TEntity> Find(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>)
{
IQueryable<TEntity> query = DataContext.Set<TEntity>();
if (filter != null)
query = query.Where(filter);
return query;
}
}
不幸的是,下面几行:
DataContext.Set<TEntity>()...
生成以下错误:
The Type 'TEntity' must be a reference type in order to use it as parameter 'TEntity'
我如何定义这个通用的存储库,以确保T是一个实现IArchiveable的类?
感谢的人,我知道这很简单....星期一 – 2015-02-23 16:43:39