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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

5664閲覧

EntityFrameworkで複数のDB環境構築

shiroman

総合スコア17

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2019/11/17 08:26

前提

EntityFrameworkを使って、データベースファーストのオブジェクトを生成しました。
実行には2つの環境があり、それぞれを開発環境と本番環境と呼称します。

開発環境では、名の通り、新しい機能を実装するためにデータベースのテーブルを新しく作ったり変更したり、また検証のために本番環境からデータベースをコピーしたりしてデバッグなども行っています。

本番環境では、開発環境から段階的に機能を取り入れていきます。

つまり、新規機能の開発やテストは「開発環境」のDBにアクセスし、システムの運用自体は「本番環境」のDBにアクセスするということになります。

思いついたやり方として、1つのプロジェクト内に、開発環境と本番環境のDBオブジェクトを別名のedmxとして作成し、App.config内の接続文字列の定義を変更してDBのアクセス先を切り替えるというものでした。

以下はテスト環境に接続するときのApp.Configの状態です。

<connectionStrings> <!-- テスト環境 --> <add name="FooEntities" connectionString="metadata=res://*/○○○○DevDB.csdl(以下略)" providerName="System.Data.EntityClient" /> <!-- 本番環境 --> <!-- <add name="FooEntities" connectionString="metadata=res://*/○○○○DB.csdl(以下略)" providerName="System.Data.EntityClient" /> --> </connectionStrings>

困っていること

稚拙ながら、上記のようなやり方しか思いつかず、このやり方で運用すると主に次の問題点があります。

  • DB接続先を切り替えるたびにApp.Configの内容を変更する必要がある
  • モデルを更新するときに毎回本来のモデル名と同一に名前を変更する必要がある

実現したいこと

AppConfigを自分で書き換えなくとも、構成マネージャからビルドターゲットに連動してDB接続先が変われば、最低限良いのかなと思っています。

しかしながら、本来のSQLServer+Entityframework の運用の仕方としては不完全で、もっと効率の良い使い方があるはずなのですが、これらの運用方法を達成するにはどのようにするのが良いのか。

この両面でご意見をいただければ、またご教授いただければ幸いです。

補足情報(FW/ツールのバージョンなど)

  • VisualStudio 2013
  • EntityFramework 6.0

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2019/11/17 14:37

コードファーストにするって選択肢はないのですか?
shiroman

2019/11/22 00:29

既に旧システムでデータベースが存在し、レコードも入って運用されているもので、システムを一新する必要があったため、今回はデータベースファーストを選択しました。 別の機会でコードファーストもやってみたいです。
guest

回答1

0

ベストアンサー

テーブル定義が完全に一致するのであれば、configのname属性をそれぞれ違う名前にしてコネクションを作る際のコンストラクタでnameを指定するとこをまで引数で渡すようにすればできます。
ただ、テーブル定義が参照先で変わる場合は実行時エラーになるので使えません。

その場合はそれぞれの接続先ごとに作るか、共通の項目しか使用しないのであればDapperなどを使用してSQLを自分で記述することになるかと思います

投稿2019/11/17 12:10

len_souko

総合スコア1337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiroman

2019/11/22 00:31

回答ありがとうございます。 教えていただいたやり方で目的を達成することができました。 partialなclassで接続文字列を指定できるようにしましたが、デフォルトコンストラクタを使わないようにするルールを徹底しないと、想定した動作にならなくなってしまうことが現在の課題です。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問