1

在针对 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
    }
}

非常感谢任何建议。

4

2 回答 2

1

要直接解决您的问题,您可以entities转换为ObjectSet<T>并使用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会更自然。

于 2010-06-29T11:40:07.477 回答
0

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

于 2010-07-08T20:58:32.687 回答