C# - EF存储库

时间:2011-03-25 21:53:44

标签: c# entity-framework ef-code-first

我已经为我的EF实现与我的应用程序交互的方式提供了两种可能的方法。第一个是简单的存储库,第二个是相当动态的版本。这两个解决方案都根据sql profiler生成相同的sql查询 - 所以仅此而已。

现在是我的问题,与解决方案2相比,解决方案1是否有任何性能开销? - 如果是的话,从长远来看是否重要?

解决方案1:

public class Repository
{
    public MyContext Ctx = new MyContext();

    public IEnumerable<T> GetAll<T>() where T : class
    {
        return Ctx.Set<T>();
    }
}

......以及调用它的代码:

var rep = new Repository();

Console.WriteLine("DEALERS:");
foreach(var dealer in rep.GetAll<Dealer>())
{
    Console.WriteLine(dealer.Name);
}

Console.WriteLine("CARS:");
foreach (var car in rep.GetAll<Car>())
{
    Console.WriteLine(car.CarName);
}

解决方案2:

public class Repository<T> where T : class
{
    private readonly MyContext _ctx = new MyContext();
    private readonly IDbSet<T> _dbset;

    public Repository()
    {
        _dbset = _ctx.Set<T>();
    }

    public IEnumerable<T> GetAll()
    {
        return _dbset;
    }
}

......以及调用它的代码:

var dealerRep = new Repository<Dealer>();
var carRep = new Repository<Car>();

Console.WriteLine("DEALERS:");
foreach(var dealer in dealerRep.GetAll())
{
    Console.WriteLine(dealer.Name);
}

Console.WriteLine("CARS:");
foreach (var car in carRep.GetAll())
{
    Console.WriteLine(car.CarName);
}

2 个答案:

答案 0 :(得分:1)

EF是一个ORM并且已经实现了Repository模式,绝对不需要将它包装在您自己的存储库中。

答案 1 :(得分:0)

您需要在每个存储库中至少访问同一个集合两次, 看两种解决方案是否真的相同。

在第二次调用时检查分析器并可能更改数据 通过另一个上下文,在访问之间,以确保行为是相同的。