1

SQL Server 2008を使用するII6でASP.Net-MVC3を使用するWebアプリケーションに取り組んでいます。プロジェクトの詳細を説明できないため、この質問の目的のために、ライブラリ用であるとしましょう。本があり、人々はこれらの本をチェックアウトすることができます。過去のチェックアウトチェックアウトの記録を残したいと思います。したがって、データスキーマは次のとおりです。

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

チェックアウトとブックの関係は多対1であるという考え方ですが、「アクティブ」または「期限切れなし」になるチェックアウトは1つだけです。つまり、ブックご​​とに最大で1つのチェックアウトの有効期限が現在よりも長くなります。時間。アプリケーションはこれを強制します。

私の最初の質問は次のとおりです。これは、前述の要件に適したデータベース設計だと思いますか?または、「期限切れ」のブール列をチェックアウトテーブルに含める必要がありますか?他のアイデア?

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; }

    ...

}

データアクセス層では、SqlCommandやSqlDataReaderなどのSystem.Dataクラスを使用しているだけなので、RelationshipsやLazy LoadingなどのEF、LinqToSqlなどの利点はありません。

私の問題は、これらの本を検索して、次のようなテーブルを表示したいということです。

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;}
}

ビューにリストを作成させますか?

または、BookモデルにCheckOutプロパティを追加する必要がありますか?

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

    ... Other Book Fields ...

    public Checkout ActiveCheckout { get; set; }
}
4

1 に答える 1

0

ビューモデルの設計方法は、モデルの設計方法に影響を与えてはなりません。その逆も同様です。モデルは通常、ドメインを表し、ビューモデルは(通常)特定のパーツを表示するのに適したこれらのモデルの変換です。

私があなたなら、あなたが言及したBookSearchTableRowクラスのようなもののIEnumerableをあなたのビューに送信します。それはあなたが表示したいものに似ています。モデルがドメインを正しく表している場合は、ビューに必要なものがあるためにモデルを変更しないでください。それがビューモデルの目的です。

于 2012-05-28T14:58:18.153 に答える