1

私は最初の EF プロジェクトに取り組み始めました。

私のソリューションでは、EF を別のクラス ライブラリとして使用したいと考えています。

それがどのように見えるかです: http://shrani.si/f/3/Xh/32C70yts/ef5.jpg

既存のデータベースから始めて、新しいクラス ライブラリに (DbModel として) インポートしました。同様に、すべての参照を MVC4 プロジェクトにインポートしたので、既存のエンティティ クラス (DbModel.tt の場合、User.cs.cs. ..)

これらのクラス(dbテーブル)を使用している限り、すべてが機能します...新しいコントローラーを作成できます...データを編集し、Dbに書き込みます...

しかし、独自のモデルクラスを作成しようとすると、新しいコントローラー (R/W を使用する MVC コントローラー... EF を使用) を作成しようとすると、エラーが発生します - サポートされていないコンテキストタイプ

もちろん、空の Controller を作成することもできます。

DB や Model first についてはあまり見つけられませんでした (本当に基本的なことだけが役に立ちます)。ほとんどの情報は Code first アプローチに関するものです。

私のデータベースには、最後に約100個のテーブルが必要です...それがEFで何かを意味する場合。

4

1 に答える 1

1

あなたの質問は理解するのが難しいですが、Mvc4 をエンティティ フレームワーク データベース ファーストで使用するための少しの方向性を探していると思います。

私はあなたのエラーをよく理解できませんが、「自分のモデルクラスを書こうとすると...」という文は、次の点を考えさせます:

  • データベース ファーストでは、エンティティを記述する必要はありません。これらは、edmx ファイルから自動的に生成されます。
  • エンティティを使用して追加のエンティティ クラスを作成する場合、クラスは既存のエンティティから継承して、コンテキスト内の何かと一致する必要があります。
  • データベースにまったく関係のないものを表すために Model フォルダーにクラスを作成している場合、コンテキストは問題になりません。たとえば、データベースに格納されていない現在のアプリケーション ステータスを表す Status というクラスを作成している場合、コンテキストを気にする必要はありません。コンテキストは、エンティティ フレームワークによって作成されたオブジェクトにのみ必要です。
  • 最初にデータベースを使用してコンテキスト オブジェクトを記述する必要はありません。コンテキストのデフォルト名は です<database name>Entities<database name>_entities通常、データベース名にはアンダースコアが付けられているため、これを変更します。このオブジェクトは、edmx ファイルを配置した場所と同じディレクトリ/名前空間にある必要があります。
  • あなたのエラーは、独自のコンテキストを書いたように聞こえます。すべてが edmx に問題がなければ、データベースを接続するためのコードを 1 行も書く必要はありません。Web.config ファイルに接続文字列を含める必要がありますが、以下で説明するように edmx ウィザードに従えば、これは自動的に行われます。

クラスライブラリについて言及しました。私はこれを、共通ライブラリでモデル ロジックを共有する場所で頻繁に行います。

  • モデルが Model 名前空間にあることは実際には問題ではありません。彼らはどこからでも来ることができました。上記の点は、エンティティ フレームワークにも適用されます。
  • ビューでは、ライブラリにあるモデルの完全な名前空間名を使用する必要があります。たとえば、DbModel というモデル プロジェクトの DB というフォルダーにエンティティがある場合、@model宣言ではモデルはDbModel.DB.my_entity.
  • データベースの接続文字列が Web.config ファイルに含まれている必要があります。ライブラリの App.config ファイルからはコピーされません。通常はコピー アンド ペーストを使用しますが、おそらくもっと賢い方法があります。

Entity Framework と MVC4 を使用した簡単な説明を次に示します。

まず、MySQL のデータとエンティティのパッケージをインストールする必要があります。私は通常、物事を簡単にするために nuget を使用してこれらを行います。あなたはすでにこれを行っているように聞こえますが、私はこれをここに載せました。別のライブラリを使用している場合。そのライブラリで NuGet を使用します。ライブラリと MVC プロジェクトの両方をビルドするときに、適切な dll を bin ディレクトリにコピーする必要があります。

次に、データベースをインポートする必要があります。私が見つけた最良の方法は、いくつのクラスを受講するかを予測することです。あなたは約100個のテーブルを言ったので、DBなどと呼ばれるモデルフォルダーに新しいフォルダーを作成して、他のすべてと混同しないようにすることをお勧めします。この新しいフォルダーを右クリックして、新しい項目を追加する必要があります。ADO.Net データ モデルを選択します。edmx ファイルを作成する必要があります。接続項目から MySQL コネクタを選択します (ボタンには、デフォルトの MSSQL コネクタの横にある「変更...」またはそのようなものがあります)。データベース情報を入力し、画面の指示に従ってモデルをインポートします。

これで、1 つのファイルを含む DB フォルダーが作成されますが、objectbrowser などを使用して名前空間を調べると、すべてのテーブル クラスが表示されるはずです。

この後、いくつかのオプションがあります。

  • ビューでエンティティ オブジェクトを直接使用します。これには追加のコードは必要ありません
  • Controller がビューに渡す ViewModel を記述します。これらは、エンティティ フレームワーク オブジェクトに基づいています。

コントローラーは、使用するモデルを実際に気にする必要はありません。モデルの DB フォルダーに作成したコンテキストを使用する典型的なコントローラーの例を次に示します。

public class HomeController : MvcController
{
    private Model.DB.my_database_context context = new Model.DB.my_database_context();

    public ActionResult ShowSomething()
    {
        return this.View(context.users.First()); //assuming you have a table called user
    }
}

これは非常に堅牢ではありません (テーブルにレコードがない場合、First() を使用すると例外がスローされます) が、Views/Home フォルダーに ShowSomething.cshtml というビューがある場合は、次のようになります。

@model Model.DB.a_table

@Model.user_name

ユーザー名を表示するだけです

モデルで興味深いのは、Web API コントローラーを使用することです。

public class ValuesController : ApiController
{
    private Model.DB.my_database_context context = new Model.DB.my_database_context();

    public IEnumerable Get()
    {
        return context.values; //assuming you have a table called values
    }

    public value Get(string id)
    {
        return context.values.Where(v => v.id == id).FirstOrDefault();
    }
}

これらはコンテキストを取得し、リクエストの特定のヘッダー (Accept-Type など) に応じて、XML、JSON、またはその他にシリアル化されたエンティティを直接出力します。

于 2013-04-01T17:32:23.680 に答える