[英]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.