我该如何为这个应用程序设计我的模型/ viewmodel?

时间:2012-05-27 02:55:32

标签: asp.net-mvc-3 database-design model viewmodel database-schema

我正在使用SQL Server 2008在II6上使用ASP.Net-MVC3进行Web应用程序。我无法提供有关该项目的详细信息,所以让我们说这个问题的目的是为了库。有书籍,人们可以查看这些书籍。我们想要保留过去检查CheckOuts的记录。所以这是数据模式:

Books                   Checkouts
-------------------     ----------------------------
| ID   (PK)        |    | ID(PK)                   |
| Title varchar(50)|    | BookId (FK Books.ID)     |
|                  |    | CheckoutDate (DateTime)  |
|  ...             |    | ExpirationDate (DateTime)|
|                  |    | Username (varchar(50)    |
|                  |    | ...                      |
-------------------     ----------------------------

我们的想法是Check Outs和Books之间的关系是多对一的,但只有一个CheckOut会“活跃”或“未过期”,即每本书最多只有一个CheckOut会有更长的失效日期比现在的时间。该应用程序将强制执行此操作。

我的第一个问题是:您认为这是针对上述要求的良好数据库设计吗?或者我应该在Check Outs表中包含“Expired”布尔列?其他想法?

我们的MVC模型如下:

public class Book {
    public int ID { get; set; }
    public string Title{ get; set; }

    ...

}

public class Checkout {
    public int ID { get; set; }
    public int BookID { get; set; }
    public sting Username { get; set; }
    public DateTime CheckOutDate{ get; set; }
    public DateTime ExpirationDate { get; set; }

    ...

}

对于我们的数据访问层,我们只使用System.Data类,如SqlCommand和SqlDataReader,因此EF,LinqToSql等没有任何好处,例如Relationships和Lazy Loading。

现在我的问题是我们想搜索这些书籍并显示如下表格:

Title     Checked Out  Checked Out By  Check Out Expiration
--------  -----------  --------------  ----------------------
Book1          Yes         Username        01/01/1970

查询会使此信息看起来像

SELECT *
FROM Books
LEFT JOIN Checkouts ON Checkouts.BookID = Book.Id
WHERE Checkouts.ExpirationDate <= GETDATE()

我该怎么做?

我会制作这样的模型

public class BookSearchTableRow {
    public string Title { get; set;}
    public bool CheckedOut { get; set;}
    public string CheckedOutBy { get; set;}
    public DateTime CheckOutExpiration { get; set;}
}

并让我的视图获取列表?

或者我应该将CheckOut属性添加到我的Book模型中吗?

public class Book {
    public int ID { get; set; }
    public string Title{ get; set; }

    ... Other Book Fields ...

    public Checkout ActiveCheckout { get; set; }
}

1 个答案:

答案 0 :(得分:0)

如何设计视图模型不应影响模型的设计方式,反之亦然。您的模型通常代表您的域,您的视图模型(通常)是适合显示特定部分的模型的转换。

如果我是你,我会向你的视图发送一个类似你提到的BookSearchTableRow类的IEnumerable。这类似于你想要显示的内容。如果您的模型正确表示您的域,则不应因视图需要而修改它们。这就是视图模型的用途。