13

私はasp.net mvcを学んでおり、それを実証する素晴らしいチュートリアルを経験しました。このチュートリアルでは、Entity Framework も使用しました。

使用する必要がある独自のデータ アクセス クラスがあります。クラスと MVC フレームワークの間のギャップを埋めるために何をする必要があるかについて、少し混乱しています。たとえば、チュートリアルでは、MovieController.cs ファイル内に、次のような Edit メソッドがあります。

[HttpPost]
        public ActionResult Edit(Movie movie)
        {
            if (ModelState.IsValid)
            {
                db.Entry(movie).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(movie);
        }

Entity フレームワークを使用しない場合、どのようになりますか? ModelState.IsValid を使用して、完了したように状態を保存する必要がありますか?

db.Entry(movie).State = EntityState.Modified;

お知らせ下さい。エンティティ フレームワークを使用せずに asp.net mvc を使用する明確に記述された例は素晴らしいでしょう。

私が知る必要があるのは、ここで状態が果たす役割と、それを使用することが必須なのか、それともエンティティ フレームワークの動作の一部にすぎないのかということです。

これを次のように書き直します。

[HttpPost]
public ActionResult Edit(Movie movie)
{
    myDBObject.SaveChanges();
    return RedirectToAction("Index");

}

myDBObject は、カスタム データベース アクセス オブジェクトです。

4

4 に答える 4

20

コントローラーがEntity Frameworkなどのデータアクセスフレームワークを直接使用する例は、悪い例です。インターネット全体がそのようなもので汚染されています。目を痛めずに見ることはほとんどできません。私はそれらを悪い習慣と考えています。データ アクセスは、リポジトリ内で分離および抽象化する必要があります。たとえば、次のようになります。

public interface IMoviesRepository
{
    Movie Get(int id);
    void Save(Movie movie);
}

次に、プレーンな ADO.NET、EF、NHibernate、リモート Web サービス呼び出し、カスタム ORM などを使用して、このインターフェイスを実装できます。

public class MyCustomFrameworkMoviesRepository: IMoviesRepository
{
    ...
}

コントローラーは、このリポジトリー・インターフェースをコンストラクター引数として受け取ります。

public class MoviesController: Controller
{
    private readonly IMoviesRepository _repository;
    public MoviesController(IMoviesRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index(int id)
    {
        var movie = _repository.Get(id);
        return View(movie);
    }

    [HttpPost]
    public ActionResult Index(Movie movie)
    {
        if (!ModelState.IsValid)
        {
            return View(movie);
        }

        _repository.Save(movie);
        return RedirectToAction("Success");
    }
}

最後の部分は、依存性注入フレームワークを構成して、リポジトリの正しい実装をコントローラーに渡すことです。ご覧のとおり、データがフェッチされる方法は、コントローラーのロジックから完全に切り離されています。それはあるべき姿です。アプリケーションの異なるレイヤー間の強い結合を常に避けるようにしてください。

State プロパティに関する質問に答えるには、これは EF に完全に固有のものです。コントローラーでこのようなものを見るのは本当に残念です。

これをさらに進めて改善するには、ビュー モデルを導入します。ビュー モデルは、特定のビューの要件を満たすように特別に設計されたクラスです。たとえば、Movie はドメイン モデルです。ドメイン モデルをビューに直接渡してはなりません。コントローラーのアクションは、アクションの引数としてドメイン モデルを使用しないでください。特定のビューに必要なものだけを含むビュー モデルを定義してから、ビュー モデルとドメイン モデル間のマッピングを実行する必要があります。AutoMapperなどのフレームワークを使用すると、これが非常に簡単になります。

于 2011-10-12T20:30:16.163 に答える
2

うーん。

MVC とエンティティ フレームワークは、実際には互いに何の関係もありません。彼らは一緒にうまく機能します。

ビューモデルをif (ModelState.IsValid)検証します。バリデーターでビューオブジェクトを使用していない場合、それは少し無意味です。もしそうなら、それは非常に価値があります。

括弧内if (ModelState.IsValid)では、Web ページ (通常はビュー モデル) から投稿データを取得し、それをデータベースに永続化するオブジェクトに適用します。EF がよく使用されるのは、一度設定すると、保守がかなり簡単で、記述するコードがはるかに少ないためです。

            db.Entry(movie).State = EntityState.Modified;
            db.SaveChanges();

どちらもEF関連です。これらは、リポジトリ クラスのメソッドとオブジェクトに置き換える必要があります。

            return RedirectToAction("Index");

MVCです。データ ストアへの永続化が成功したら、コントロールをインデックス ページに戻します。

        return View(movie);

何かが検証に失敗したため、元のビューにリダイレクトするために使用されます。

于 2011-10-12T20:29:37.147 に答える
1

それでも をチェックModelState.IsValidしますが、それ以外の場合、コードはあなたが持っているものと同じように見えます.

DataAnnotationsただし、これはモデルに属性があることを前提としていますが、これModelState.IsValidを使用してチェックしています。これらの属性は、Entity Framework だけでなく、任意の C# クラスのプロパティで使用できます。

この目的のために、特定のビュー モデルを作成することになる場合があります。

于 2011-10-12T20:23:49.537 に答える
0

Movie オブジェクト (http POST で渡される) とデータベース メソッド (myDBObject) を接続する必要があります。

たぶんmyDBObject.SaveChanges(movie)、あなたの db コードがオブジェクト Movie の処理方法を知っていると仮定して、あなたは大丈夫でしょう。

于 2011-10-12T20:32:45.667 に答える