簡體   English   中英

用於查找具有非主鍵值的實體的存儲庫方法

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM