【问题标题】:Function Import and Repository pattern with Entity Framework 4.0Entity Framework 4.0 的函数导入和存储库模式
【发布时间】:2011-03-09 08:01:16
【问题描述】:

在针对 EF 4.0 使用存储库模式时,谁能告诉我他们如何实现函数导入的使用?

我们有一个映射到候选实体的表,还有一个从映射到候选实体的现有存储过程中导入的函数。这在 EF 中效果很好,但我们通过使用 Repositories 进行抽象,这些 Repositories 采用其构造函数 IObjectSet,其中 T 是 POCO 实体。但是,这意味着我无法获得对函数导入的引用。我能看到的唯一方法是将 ObjectContext 的引用传递给需要它的存储库,但这对我来说有点设计味道。

即使我们的几个存储库使用自定义接口进行了扩展,我们仍然面临同样的问题。

    public class CandidateRepository : Repository<Candidate>, ICandidateRepository
{
    public CandidateRepository(IObjectSet<Candidate> entities)
        : base(entities)
    {
    }

    public Candidate GetByEmail(string email)
    {
        return Entities.SingleOrDefault(c => c.EmailAddress.Equals(email));
    }

    public bool CandidateExists(string candidateNumber)
    {
        return Entities.SingleOrDefault(c => c.Number.Equals(candidateNumber)) != null;
    }

    public Candidate GetByNumber(string number)
    {
        return Entities.SingleOrDefault(c => c.Number.Equals(number));
    }

    public Candidate GetMember(string number)
    {

        return new Candidate();  //This one needs to return from the Function Import
    }
}

非常感谢任何建议。

【问题讨论】:

    标签: entity-framework repository-pattern poco objectcontext


    【解决方案1】:

    要直接解决您的问题,您可以将entities 转换为ObjectSet&lt;T&gt; 并使用entites.Context 属性获取ObjectContext

    public Candidate GetMember(string number)
    {
        var objectSet = Enities as ObjectSet<Candidate>;
    
        if(objectSet == null) throw new Exception("Oh, it's not EF IObjectSet implementation");        
    
        return objectSet.Context.MyCustomFunction(string number);
    }
    

    如您所见,此代码依赖于特定的 IObjectSet 实现,这一点都不好。

    更好的办法是只为聚合根而不是为每个表创建存储库。因此将ObjectContext 传递给存储库ctor 会更自然。

    【讨论】:

    • 感谢 Yury 的回复。请您详细说明您对“总根”的定义好吗?我们还没有深入到无法重构以获得更好的可扩展性的开发中。
    • 嗯,“聚合根”是领域驱动设计 (DDD) 的概念。考虑一个简单的 Order 1..* OrderLine 模型。通常您不会在没有订单的情况下创建 OrderLine,因此您只需要 OrderRepository。因此 Order 是一个聚合根,持有对 OrderLines 的引用。定义聚合根是一个实际的 DDD 问题,它取决于您尝试在应用程序中“建模”的对象。
    【解决方案2】:

    我已经沿着这条路线走下去了,并且我体验到,当您将 ObjectContext 的接口实现传递到您的存储库时,它不会那么痛苦。接口实现应该有某种调用函数的方式。因此,当您传入 ObjectContext 的具体实现时,一切都应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      相关资源
      最近更新 更多