将存储库模式与实体框架一起使用(mvc店面)

时间:2009-03-29 21:44:23

标签: asp.net asp.net-mvc entity-framework domain-driven-design entity

任何人都可以伸出援助之手吗?我一直在观看MVC店面的视频,并使用这些技术创建了自己的网站,即DDD,Repository模式,但我希望使用Entity Framework。

在Interfaces中,它返回IQueryable但是我应该使用Entity Framework返回ObjectQuery吗? - 我将使用LINQ。

同样在存储的前端示例中,它是这样的:IQueryable< Category> GetCategories();

同样在MVC存储中,Category类是一个构建的实体类(标准类),但是使用Entity Framework,这些类是在对象上下文中预先构建的 - 它们不是吗?

所以我应该建立它们吗?

我有点困惑。如果有人有任何有用的示例或代码,那将非常有帮助。

正如我所说,我使用linq2sql观看了MVC店面的视频,但我真的想使用Entity Framework。

有什么想法吗?

谢谢

铁匠铺

6 个答案:

答案 0 :(得分:9)

让我一次一个回答你的问题:

您的存储库应该返回IQueryable< T>, not ObjectQuery。原因是存储库模式的整个目的是抽象出数据存储的细节。这允许您在对控制器进行单元测试时替换模拟存储库。如果您使存储库返回ObjectQuery,那么您不会抽象出实体框架。另一种说法是,您的存储库的用户不应该尽可能地知道正在进行O / R映射的实体框架。

为了在Stack Overflow中使用段落文本中的大于和小于符号,你必须像在HTML中那样对它们进行转义,即:

<

您不需要在代码块中执行此操作;在代码块中,只需键入小于/大于符号。

答案 1 :(得分:6)

如果您在http://www.asp.net/learn/mvc/#MVC_SampleApp网站上看到联系人管理器教程,他们可能会使用存储库模式和实体框架。

答案 2 :(得分:5)

几周前,我开始喜欢你了,你会发现使用EF非常容易。我的项目很小,所以我使用EF生成的实体作为我的模型类,你可以使用部分类为它们添加自己的逻辑。

以下是我的一个存储库的简单方法,例如:

    /// <summary>
    /// Finds a user by it's credentials
    /// </summary>
    /// <param name="oUser"></param>
    /// <returns></returns>
    public User FindByCredentials(string username, Byte[] password)
    {
        User user = null;

        if (!Validators.IsStringEmptyOrNull(username))
        {
            user = this.FindByCredentialsQuery(username, password).FirstOrDefault<User>();
        }

        return (Validators.IsNull(user)) ? new User() : user;

    }


    /// <summary>
    /// Finds a user by it's credentials
    /// </summary>
    /// <param name="username"></param>
    /// <param name="password"></param>
    /// <returns></returns>
    protected IQueryable<User> FindByCredentialsQuery(string username, Byte[] password)
    {
        var query = from Users in this.UserDataContext.Users
                    where
                        (Users.Username == username) &&
                        (Users.Password == password) &&
                        (Users.Enabled == true)
                    select Users;


        return query;
    }

请注意,我只在存储库中使用IQueryable,并仅返回请求的实体列表。这样我就可以控制对DB的查询总是在Repo中执行。

答案 3 :(得分:3)

实体框架的一个很好的通用存储库(活动): http://www.codeproject.com/KB/database/ImplRepositoryPatternEF.aspx

现在我使用这个作为应用程序框架(包括一个完美的存储库) http://efmvc.codeplex.com/

请大声喊叫;)

答案 4 :(得分:3)

新的MVC教程系列包含一个存储库示例,其中包含的参数可以让您指定过滤器,排序等,而无需返回IQueryable: http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

答案 5 :(得分:2)

我不确定这是否正确,但我正在使用L2E,使用AutoMapper第三方工具将生成的对象转换为域对象。