MVC模型中的数据库查询

时间:2012-07-11 05:20:54

标签: asp.net-mvc oop

在MVC项目中,如果我在Model中放置 LINQ 查询,是否违反了MVC模式?

namespace DocLibrary.Models
{
    public class Author
    {
        private DocLibraryContext db = new DocLibraryContext();

        [Key]
        public Int32 AuthorId { get; set; }

        [StringLength(20)]
        public String Name { get; set; }

        ..

        public string GetNameById(int AuthorId)
        {
            var query = from a in db.Author
                        where a.AuthorId == AuthorId
                        select a.Name;

            return query.FirstOrDefault();
        }


        public Author GetAuthorById(int AuthorId)
        {
            var query = from a in db.Author
                        where a.AuthorId.Equals(AuthorId)
                        select a;

            return query.FirstOrDefault();
        }
    }

或者我应该将这些方法(GetNameByIdGetAuthorById)移动到Controller?

3 个答案:

答案 0 :(得分:7)

  

在MVC项目中,如果我在模型中放置LINQ查询,它是否违反MVC模式?

不,这不符合MVC模式。数据库查询在模型中完全没问题。显然,您要传递给视图的模型和视图模型之间应该有明显的区别。视图模型不应包含任何特定于数据库的内容。

  

或者我应该将这些方法(GetNameById,GetAuthorById)移动到Controller?

绝对不是。控制器的职责不是查询数据库。控制器的职责是与模型通信,构建视图模型并将此视图模型传递给视图。控制器甚至不应该知道数据库是什么。

答案 1 :(得分:1)

在为ASP.NET MVC应用程序构建Model时,始终优先使用Repository模式,以便DAL层易于更改并根据需要进行测试。使用存储库模式时,您将创建一个单独的存储库类,其中包含具有约束的所有数据库访问逻辑CURD。

当我们创建存储库类时,我们创建一个接口来表示存储库类使用的所有方法。在控制器中,我们针对接口而不是存储库编写代码。

答案 2 :(得分:1)

像这样使用

internal IQueryable<Table1> GetArmyList2()
    {
        //var lists = from list in db.Table1
                 //   select list;

        //return lists;


        var query = from Table1 in db.Table1
                    where Table1.Username.Equals("asik") & Table1.Password.Equals("asik")
                    select Table1;

        return query;


    }

和控制器代码

public ActionResult asik()
    {
        var armyList = cl.GetArmyList2();
        return View(armyList);
        // return View();
    }