[英]Repository method to find an entity with a non-Primary Key value
所以我不确定我是否在标题中得到了正确的术语,但我应该能够描述我正在尝试做的事情。
我有一个“GenericRepository”类,我所有的实际Repository类都继承自它,它包含几个泛型方法。 该类的代码如下
public class GenericRepository<TEntity> where TEntity : class
{
internal ReportsDirectoryEntities context;
internal DbSet<TEntity> dbSet;
public GenericRepository(ReportsDirectoryEntities context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
/////////////////////////////////////////////////////////////////////
public virtual IEnumerable<TEntity> GetAll()
{
return dbSet.ToList();
}
public virtual TEntity GetByID(int id)
{
return dbSet.Find(id);
}
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
public virtual void Delete(object id)
{
TEntity entityToDelete = dbSet.Find(id);
Delete(entityToDelete);
}
public virtual void Delete(TEntity entityToDelete)
{
if (context.Entry(entityToDelete).State == System.Data.EntityState.Detached)
{
dbSet.Attach(entityToDelete);
}
dbSet.Remove(entityToDelete);
}
public virtual void Update(TEntity entityToUpdate)
{
dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = System.Data.EntityState.Modified;
}
}
现在所有这些都很好,我现在要做的是添加一个GetByName方法,我可以传入一个实体的“Name”属性并返回它。
我试过了
public virtual TEntity GetByName(string name)
{
return (from e in context.Set<TEntity>()
where e.Name == name
select e).SingleOrDefault();
}
但是,这标志着名称“TEntity不包含名称的定义”等等,这是有道理的。
我可以轻松地在各个存储库中执行此操作,但我想知道是否有一种方法可以在Generic中执行此操作。
任何帮助是极大的赞赏!
如果所有实体类型都具有Name
属性,则可以使用Name
属性扩展TEntity
接口。
否则,您可以使用DbSet
SqlQuery()方法, DbSet
字符串查询作为参数。
为了干净利落地执行此操作,需要将TEntity
约束为具有Name属性的类型(或接口)。 否则,您使用反射(或dynamic
访问Name属性),这允许在运行时之前不会捕获的错误。
如果所有实体都使用Name作为属性,则只需创建一个接口并将其用作泛型类的约束。
接口:
public interface IStringName
{
public string Name { get; set; }
}
实体:
public partial class MyEntity : IStringName
{
public String Name { get; set; }
// Additional properties here.
}
库:
public class GenericRepository<TEntity> where TEntity : class, IStringName
{
// Your code here.
}
如果您的某个实体不使用Name属性,则有几个选项。 您可以将实体中的相应属性名称更改为Name,并将其适当地映射到原始storagemodel名称。 或者,您可以继承原始的通用存储库,例如。
NamedRepository:
public class NamedRepository<TEntity> : GenericRepository<TEntity>
where TEntity : class, IStringName
{
public NamedRepository(ReportsDirectoryEntities context) : base(context)
{
}
public virtual TEntity GetByName(string name)
{
return (from e in base.context.Set<TEntity>()
where e.Name == name
select e).SingleOrDefault();
}
}
这种方法允许您在实现新接口的实体上使用NamedRepository,而对那些不实现新接口的实体使用原始GenericRepository。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.