在一种方法中创建EF4上下文

时间:2011-08-15 14:58:34

标签: c# entity-framework-4

我有很多这样的方法:

    public IEnumerable<Director> GetAllDirectors()
    {
        using (var dbContext = new BodModelContainer())
        {
            return dbContext.Members.OfType<Director>().ToList();
        }
    }

..或者这个..

    public Member GetMemberById(int memberId)
    {
        using(var dbContext = new BodModelContainer())
        {
            return dbContext.Members.Find(new[] {memberId});
        }
    }

或那:

    public SomeType GetOrDoSomethingWithDbBySomethingElse(T1 t1var, T2, T2 var, ...)
    {
        using(var dbContext = new BodModelContainer())
        {
            return dbContext.SomeType.DoSomething();
        }
    }

所以我想重新组织所有这些方法,如:

    // create db context here
    public void InDb(Func<BodModelContainer, out SomeGenericType???> workingWithDb)
    {
         using(var dbContext = new BodModelContainer())
         {
             workingWithDb(dbContext);
         }
    }

    // using it like
    public Member GetMemberById(int memberId)
    {
            InDb((dbContext) => 
            { 
                    return dbContext.Members.Find(new[] { memberId }); 
            });
    }

问题:如何制作此类通用InDb方法,SomeGenericType???

1 个答案:

答案 0 :(得分:3)

您所描述的实际问题是您无法弄清楚如何设置Func<>的返回类型。为了能够使这个通用,您还需要使InDb也需要泛型类型。

public TRet InDb<TRet>(Func<BodModelContainer, TRet> workingWithDb) {
  TRet ret = default(TRet);
  using (var dbContext = new BodModelContainer()) {
    ret = workingWithDb(dbContext);
  }
  return ret;
}

public Member GetMemberById(int memberId) {
  return InDb(dbContext => { return dbContext.Members.Find(new[] { memberId }); });
}

应该工作(这里的所有代码都是未经测试的),或者使用匿名方法,你可以拥有一个局部变量,让.Net做所有讨厌的工作。

public void InDb(Action<BodModelContainer> workingWithDb) {
  using (var dbContext = new BodModelContainer()) {
    workingWithDb(dbContext);
  }
}

public Member GetMemberById(int memberId) {
  Member member;
  InDb(dbContext => { member = dbContext.Members.Find(new[] { memberId }); });
  return member;
}

当然,这一切都在说,我不知道这种重定向/抽象级别是否有用 - 你使它稍微复杂一点,几乎没有可感知的增益(如果有的话)。除非有很多工作设置并拆除dbContext InDb中使用的{{1}},否则我觉得它不是很有帮助。