实现通用存储库模式 - 实体密钥类型

时间:2017-04-01 16:56:14

标签: c# entity-framework generics asp.net-web-api2 repository-pattern

我正在Asp.Net web api应用程序中实现一个存储库模式。

public abstract class Repository<T> : IRepository<T> where T : EntityBase
 {
     private DbContext context_;

     public Repository(DbContext context)
     {
         context_ = context;
     }

     public virtual async Task<T> GetAsync(int id)
     {
         return await context_.Set<T>().FindAsync(id);
     }

     ...

 }

问题:

我在这里有一个方法GetAsync(int id),它适用于具有int类型的单个密钥的实体。

但是有一些实体具有string类型的键和一些具有复合键的实体。

问题:

我如何克服这个问题?

是否有可能以通用的方式克服这个问题?

1 个答案:

答案 0 :(得分:4)

您可以注意到FindAsync接受对象数组作为参数,因此您可以像这样更改GetAsync

public virtual Task<T> GetAsync(params object[] keys)
{
     return context_.Set<T>().FindAsync(keys);
}

然后,您可以使用您喜欢的任何键调用GetAsync,例如:

GetAsync(1);
GetAsync("string key");
GetAsync(1, "composite key");

附注:实体框架Set<T>已经是通用存储库,因此在该实体库上添加另一个存储库并不会带来太多好处。