質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

ASP.NET MVC5でデータベースファーストで作成したEDMファイルやコンテキストクラスに変更を加える為、マイグレーションを実行する方法

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,689

widget11

score 187

環境:
windows10
Visual Studio2017
EntityFramework6.2
MySQL DATA8.10.2
MySQL DATA ENTITY6.10.8

現在ASP.NET MVCの練習としてフルスクラッチでECサイトを作成しております。
MySQL WorkBenchでER図を作り、それを元にEDMファイルを作成できると思います。
作成されたEDMファイルを見るとある程度リレーションはうまくいっていたのですが、一部のリレーションがうまくいっておりません。
EDMファイルを削除し再度作っても同じことであると思うので、コンテキストクラスを書き換えマイグレーションを行いたいです。
自身はASP.NET MVCの他にruby on railsを触っておりこのようなことは行っていたのでおそらく出来ると踏んでいるのですが、ASP.NEt MVCのリファレンスが少ない為質問致しました。
イメージ説明

これはEDMファイルのリレーションの一部なのですが、orders(注文)テーブルとproucts(製品)テーブルはn対nの関係であるためoredered_products(カート)テーブルのようなものを挟み、注文テーブルとカートテーブルを1対n、productsとorderd_productsを1対nとMySQL WorkBenchのER図で定義し、EDMファイルを作成したのですが以上の画像のようにバグなのか紐づけがされていません。
コンテキストクラスを覗いてみても、

//ECShop.context.cs
//ordersテーブルのコンテキストクラス
public partial class orders
    {
        public int orders_id { get; set; }
        public int users_id { get; set; }
        public int payment_id { get; set; }
        public int total_amount { get; set; }
        public string date_created { get; set; }
         public virtual payment payment { get; set; }
    }

//ordered_productsテーブルのコンテキストクラス
 public partial class ordered_products
    {
        public int orders_id { get; set; }
        public int products_id { get; set; }
        public int amount { get; set; }        
    }


のようにordered_productsテーブルが親、子(railsでいうhas_to、belongs_toですかね)として定義されていませんでした。
テーブルは当然複数あるのですが、ここだけではなくリレーションがうまくいっていない箇所がちらほら見受けられます。

そこでコンテキストクラスをの内容を書き換え、マイグレーションを行いEDMファイルやDBに反映させたいのですがどうすればよいでしょうか?
具体的に分からないのは、コンテクストクラス内にどのようなコードでリレーションを定義すればよいか、またどのようなコマンドをどこで行えばっよいかです。
サンプルサイトのようにコードファーストにおいてのマイグレーションはネットに少し落ちているのですがデータベースファーストの話が一つも見受けられなかったです・・・
長くなりましたがよろしくお願い致します。(ASP.NET MVCはrailsやcakeのようにコミュニティが活発でなくリファレンスが少ないせいか、初心者には非常に難しく感じます。。。)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2018/10/20 10:21

    タイトルは「データベースファースト」となってますが、Code First、Model First とゴッチャになっているということはありませんか? 質問本文の内容を見ると Model First のようにも見えますけど。

    キャンセル

回答 2

checkベストアンサー

+1

タイトルは「データベースファースト」となってますが、質問文を見るとどうもそのあたりが定かでないようです。

まず、本当にタイトル通り DB First で行いたいのか、それとも Model First または Code First なのかを明確にしてください。(「MySQL WorkBench で ER 図」というのは Moodel First に用いる Model を作成する作業のように思えます)

とりあえず DB First の話として少しレスします。

DB FIrst という名前のように、既存の DB が存在するという条件がまずあって、それから Visual Studio のウィザードを使って Entity Data Model を作成して利用するのが基本です。

例えば、既存のデータベースに products, orders テーブルが存在し、それに質問者さんが書かれたような orderd_products テーブルを追加する場合、まず、DB に直接 orderd_products テーブルを作成し、それから proucts テーブル、orders テーブルに FK 制約を張ることになります。

その後で Visual Studio のウィザードを利用して ADO.NET Entity Data Model を生成(既存のものがあれば再生成)することになります。

そこに ER 図でモデルを作るとか Migration という話は出てこないはずです。

Microsoft が提供している SQL Server の Northwind サンプルデータベースには、質問者さんのやりたいこととほぼ同じように Products テーブルと Orders テーブルを多対多で関連付ける Orders_Details テーブルが含まれていますので、それをベースに DB First で Entity Data Model を作った例を紹介しておきます。

Northwind をベースに Visual Studio のウィザードを利用して Entity Data Model を作成すると以下のような .edmx が生成されそれをアプリから利用するためのコードも生成され、即利用できるようになります。Orders_Details テーブルが Products テーブル、Orders テーブルを多対多で関連付けているのが分かるでしょうか?

イメージ説明

サンプルサイトのようにコードファーストにおいてのマイグレーションはネットに少し落ちているのですがデータベースファーストの話が一つも見受けられなかったです・・・

それは質問者さんが実際にやっているのは DB First ではなく、Model First だからだと思います。ホントに DB First であれば MySQL でもネットの記事は結構見つかると思います。

Model First は SQL Server でも自分はほとんど例は見たことがないし、ましてや MySQL では・・・

ASP.NET MVCはrailsやcakeのようにコミュニティが活発でなくリファレンスが少ないせいか、

ASP.NET MVC の話としてその中だけで考えているからではないのですか? Entity Framework, ADO.NET Entity Data Model, DB First, Code First, Model First, Linq to Entities の話として考えたらどうですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

DB first で作ったEntity Data Modelを後からいじるのはとてつもなく面倒なので実質出来ないと思ったほうが良いです。
後からいじるためには、Entity Data Model作成の時[データーベースからCode first]を選択してください。
後はほぼCode Firstと一緒ですが、
Enable-Migrationsの後
Add-Migration Initial -IgnoreChanges
と-IgnoreChangesオプションが必要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • MySQLに関する質問
  • ASP.NET MVC5でデータベースファーストで作成したEDMファイルやコンテキストクラスに変更を加える為、マイグレーションを実行する方法