豚吐露@wiki
ASP.NET_MVC5+EntityFramework6+PostgreSQL
最終更新:
Bot(ページ名リンク)
-
view
ASP.NET MVC5+EntityFramework6+PostgreSQL9.3環境の作り方
Windows 7 Professional
Visual Studio 2013 Professional
.Net Framework 4.5
ASP.NET MVC 5.1.2
Web API 2.1
Entity Framework 6.1.0 ※以降EF6
PostgreSQ L9.3.5.1
Visual Studio 2013 Professional
.Net Framework 4.5
ASP.NET MVC 5.1.2
Web API 2.1
Entity Framework 6.1.0 ※以降EF6
PostgreSQ L9.3.5.1
c.f.) 参考にしたサイト
http://www.codeproject.com/Articles/783552/Using-PostgreSQL-with-Entity-Framework-in-ASP-NET
http://www.wekeroad.com/2014/02/05/using-entity-framework-6-with-postgresql/
http://msdn.microsoft.com/en-us/data/jj591617.aspx
http://msdn.microsoft.com/en-us/data/jj819164
http://www.codeproject.com/Articles/783552/Using-PostgreSQL-with-Entity-Framework-in-ASP-NET
http://www.wekeroad.com/2014/02/05/using-entity-framework-6-with-postgresql/
http://msdn.microsoft.com/en-us/data/jj591617.aspx
http://msdn.microsoft.com/en-us/data/jj819164
上記環境下でのRestfulなWebAPIを作る手順をメモっとく。
- MVC5 projectの作成
新規:ソリューション作成から。[ファイル]-[新規作成]-[プロジェクト]。
追加:ソリューション名を右クリック[追加]-[新しいプロジェクト]。
追加:ソリューション名を右クリック[追加]-[新しいプロジェクト]。
左のツリーから『Visual C#』を選択し、真ん中のリストから『ASP.NET Webアプリケーション』を選択。
名前と場所は、適当に。『OK』を押下すると、『テンプレートの選択』画面になる。
ココで『MVC』を選択。下の方にチェックボックスがあって、『MVC』のチェックが外れないようになってる。
で、『WebAPI』をチェックして『OK』押下。
名前と場所は、適当に。『OK』を押下すると、『テンプレートの選択』画面になる。
ココで『MVC』を選択。下の方にチェックボックスがあって、『MVC』のチェックが外れないようになってる。
で、『WebAPI』をチェックして『OK』押下。
こんな感じのファイルが追加される。
+ | 追加されたファイル一覧 |
MVCなので当然『M:Models』『V:Views』『C:Controllers』となる。
単純なMVCのルーティングは『App_Start\RouteConfig.cs』に、WebApiのルーティングは『App_Start\WebApiConfig.cs』にある。
単純なMVCのルーティングは『App_Start\RouteConfig.cs』に、WebApiのルーティングは『App_Start\WebApiConfig.cs』にある。
とりあえず、追加したプロジェクト名を右クリックして、[デバッグ]-[新しいインスタンスを開始]を選択する。projectが追加された時点のものがbuildされて表示される。ASP.NETって大きく書かれたBootstrapなページが表示されるハズ。
『RouteConfig.cs』にデフォルト値として、Controllerが『Home』、Actionが『Index』で指定されている。
で、URLは、【Controller】/【Action】/【ID】と定義されてるので...
『http://localhost:99999/』と表示されたら『http://localhost:99999/Home/Index』が表示されてるってぇこと。
つまり、この表示に使われているControllerは、『HomeController』クラスの『Index』メソッド。使われているViewは、『Views\Home\Index.cshtml』。
『RouteConfig.cs』にデフォルト値として、Controllerが『Home』、Actionが『Index』で指定されている。
で、URLは、【Controller】/【Action】/【ID】と定義されてるので...
『http://localhost:99999/』と表示されたら『http://localhost:99999/Home/Index』が表示されてるってぇこと。
つまり、この表示に使われているControllerは、『HomeController』クラスの『Index』メソッド。使われているViewは、『Views\Home\Index.cshtml』。
- PostgreSQLへの接続。
EntityFramework6を使ってPostgreSQLへ接続するには、色々準備が必要。
メニューから[ツール]-[NuGetパッケージ マネージャー]-[ソリューションのNuGetパッケージの管理]を選択。
『NuGetパッケージの管理』ダイアログが開く。
左のツリーから『オンライン』を選択し、右上の『オンラインの検索』欄に『npgsql』と入力してしばらく待つ。
検索結果が表示されたら、『Npgsql for Entity Framework』をインストールする。
※『Npgsql』は自動で一緒にインストールされる。
対象のprojectの選択が出たら、必要なprojectを選択してやれば良い。
『NuGetパッケージの管理』ダイアログが開く。
左のツリーから『オンライン』を選択し、右上の『オンラインの検索』欄に『npgsql』と入力してしばらく待つ。
検索結果が表示されたら、『Npgsql for Entity Framework』をインストールする。
※『Npgsql』は自動で一緒にインストールされる。
対象のprojectの選択が出たら、必要なprojectを選択してやれば良い。
dotConnectのインストール。
メニューから[ツール]-[拡張機能と更新プログラム]を選択。
『拡張機能と更新プログラム』ダイアログの左側のツリーで『オンライン』を選択。
右上の『Visual Studioギャラリーの検索』欄に『dotConnect PostgreSQL』と入力してしばらくすると、検索結果が表示される。こんなヤツらが表示されると思うが...
メニューから[ツール]-[拡張機能と更新プログラム]を選択。
『拡張機能と更新プログラム』ダイアログの左側のツリーで『オンライン』を選択。
右上の『Visual Studioギャラリーの検索』欄に『dotConnect PostgreSQL』と入力してしばらくすると、検索結果が表示される。こんなヤツらが表示されると思うが...
拡張機能名 | 拡張機能説明 | DownloadFile | FileSize |
dotConnect for PostgreSQL |
dotConnect for PostgreSQL is a database connectivity solution build over ADO.NET architecture. With Entity Framework, LINQ to SQL support it introduces new approaches for designing applications. |
dcpostgresql.exe | 63,498,352 Byte |
dotConnect Express for PostgreSQL |
dotConnect Express for PostgreSQL is a free of charge database connectivity solution build over ADO.NET architecture. It offers basic functionality for developing database-related applications, web sites. |
dcpostgresqlfree.exe | 15,502,760 Byte |
dotConnect Mobile for PostgreSQL |
dotConnect Mobile for PostgreSQL is a database connectivity solution build over ADO.NET architecture. It introduces new approaches for designing applications, boosts productivity of database application development. |
dcpostgresqlmob.exe | 8,182,360 Byte |
Express付きヤツの説明が気になりますが...とりあえず、EF6を使いたいだけなら『dotConnect Express for PostgreSQL』で良いらしい。
Express無しのだと何が変わるんか分からんのですが...(゚Д゚)
→ どうやらExpress有りだと[サーバーエクスプローラー]-[データ接続]のデータソースとして追加されないみたい。
※インストールはココを参考にして入れてみてください。Express付きでも無しでもほとんど変わらんハズ。
Express無しのだと何が変わるんか分からんのですが...(゚Д゚)
→ どうやらExpress有りだと[サーバーエクスプローラー]-[データ接続]のデータソースとして追加されないみたい。
※インストールはココを参考にして入れてみてください。Express付きでも無しでもほとんど変わらんハズ。
『dotConnect Express for PostgreSQL』をDatabase Providerとして登録する。
作成したプロジェクトの直下にある『Web.config』を開く。
[configuration]-[connectionStrings]の下に『add』を追加。具体的には下の例の4行目が追加されただけ。
『name』はDB接続class名にもなるので、そこら辺考慮して名付ける。『connectionString』の中は自分の環境に合わせてやってください。
※ココで軽くハマったんじゃが...DB名の大文字小文字違ってもPostgreSQLって許してくれんみたい。(´・ω・`)
e.g.) connectionStrings
[configuration]-[connectionStrings]の下に『add』を追加。具体的には下の例の4行目が追加されただけ。
『name』はDB接続class名にもなるので、そこら辺考慮して名付ける。『connectionString』の中は自分の環境に合わせてやってください。
※ココで軽くハマったんじゃが...DB名の大文字小文字違ってもPostgreSQLって許してくれんみたい。(´・ω・`)
e.g.) connectionStrings
- <connectionStrings>
- <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-GisWebApi-20141021085606.mdf;Initial Catalog=aspnet-GisWebApi-20141021085606;Integrated Security=True"
- providerName="System.Data.SqlClient" />
- <add name="PgContext" connectionString="Server=localhost; Port=5432; User Id=postgres; Password=password; Database=postgres; Encoding=UNICODE; Preload Reader=true;" providerName="Npgsql" />
- </connectionStrings>
EF6関係の設定部分。『Web.config』の下の方にある。
修正後で何が変わったかってぇと2行目の『defaultConnectionFactory』をPostgreSQL用に変えてる。8~12行目の『system.data』がごそっと追加。
5行目の『provider』にPostgreSQL用の設定が追加されてる。これはdotConnectの仕業なので、手動で追加しないように注意。
あと、なんたらnameって項目で出てきてる『Npgsql』ってキーワードはconnectionStrings含めて整合取らせてあげんといけんのんで注意ね。
修正後で何が変わったかってぇと2行目の『defaultConnectionFactory』をPostgreSQL用に変えてる。8~12行目の『system.data』がごそっと追加。
5行目の『provider』にPostgreSQL用の設定が追加されてる。これはdotConnectの仕業なので、手動で追加しないように注意。
あと、なんたらnameって項目で出てきてる『Npgsql』ってキーワードはconnectionStrings含めて整合取らせてあげんといけんのんで注意ね。
+ | e.g.) 【修正前】entityFramework |
e.g.) 【修正後】entityFramework
- <entityFramework>
- <defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql" />
- <providers>
- <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
- <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
- </providers>
- </entityFramework>
- <system.data>
- <DbProviderFactories>
- <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
- </DbProviderFactories>
- </system.data>
『Model』classの作成。
『Models』を右クリックして[追加]-[クラス]を選択。
- namespace Hoge.Models.dto
- {
- public class hage
- {
- [Key]
- public int id { get; set; }
- public string text { get; set; }
- public DateTime createDate { get; set; }
- public DateTime updateDate { get; set; }
- public string delflg { get; set; }
- }
- }
対応元のtableはこんな感じ。
- CREATE TABLE hoge.hage
- (
- id INTEGER NOT NULL DEFAULT NEXTVAL('hoge.hage_seq'::regclass),
- text CHARACTER VARYING,
- createDate TIMESTAMP WITHOUT TIME zone,
- createDate TIMESTAMP WITHOUT TIME zone,
- delflg CHARACTER(1) NOT NULL,
- CONSTRAINT movies_pkey PRIMARY KEY (id)
- )
- WITH (
- OIDS=FALSE
- );
- ALTER TABLE nbs1.movies
- OWNER TO nbs1;
-
『DbContext』classの作成。
ソリューションエクスプローラーの『Models』を右クリックして[追加]-[新しい項目]を選択。
『新しい項目の追加』ダイアログで、左のツリーから『Visual C#』を選択し、真ん中のリストから『クラス』を選択。
名前欄に『connectionStrings』に追加した『add』の『name』属性に指定した名前を入力。今回の場合だと『PgContext』ですね。
『新しい項目の追加』ダイアログで、左のツリーから『Visual C#』を選択し、真ん中のリストから『クラス』を選択。
名前欄に『connectionStrings』に追加した『add』の『name』属性に指定した名前を入力。今回の場合だと『PgContext』ですね。
- モデルにIDってプロパティは必須っぽ。IDってプロパティを用意しない場合、[Key]アノテーションをプライマリーキーにつけてやらんといけんらしい。
でも、『[Key]』付けてもダメだったことあるような気がするんじゃがなぁ...
ダメなときのエラー。
モデルの生成中に 1 つまたは複数の妥当性確認エラーが見つかりました: hoge.Models._hoge_tbl: : EntityType 'hoge_tbl' にはキーが定義されていません。この EntityType にはキーを定義してください。 hoge: EntityType: EntitySet 'hoge' はキーが定義されていない型 'hoge_tbl' に基づいています。
- 1つのDBContextに対して1つのDB(scheme)らしい。
別schemaのtableにアクセスしたい場合は、Tableアノテーションを利用。
[Table("SchemaName.TableName")]
で、別schemaのtableにアクセスできる...のか?
[Table("SchemaName.TableName")]
で、別schemaのtableにアクセスできる...のか?
更新日: 2015年12月25日 (金) 15時43分34秒
- ありがとうございます。参考にさせていただきました! -- (名無しさん) 2018-01-29 14:53:24