豚吐露@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



上記環境下でのRestfulなWebAPIを作る手順をメモっとく。

  • MVC5 projectの作成
新規:ソリューション作成から。[ファイル]-[新規作成]-[プロジェクト]。
追加:ソリューション名を右クリック[追加]-[新しいプロジェクト]。

左のツリーから『Visual C#』を選択し、真ん中のリストから『ASP.NET Webアプリケーション』を選択。
名前と場所は、適当に。『OK』を押下すると、『テンプレートの選択』画面になる。
ココで『MVC』を選択。下の方にチェックボックスがあって、『MVC』のチェックが外れないようになってる。
で、『WebAPI』をチェックして『OK』押下。

こんな感じのファイルが追加される。
+ 追加されたファイル一覧
追加されたファイル一覧
hoge
│  favicon.ico
│  hoge.csproj
│  hoge.csproj.user
│  Global.asax
│  Global.asax.cs
│  packages.config
│  Project_Readme.html
│  Startup.cs
│  Web.config
│  Web.Debug.config
│  Web.Release.config
│
├─App_Data
├─App_Start
│      BundleConfig.cs
│      FilterConfig.cs
│      IdentityConfig.cs
│      RouteConfig.cs
│      Startup.Auth.cs
│      WebApiConfig.cs
│
├─Content
│      bootstrap.css
│      bootstrap.min.css
│      Site.css
│
├─Controllers
│      AccountController.cs
│      HomeController.cs
│
├─fonts
│      glyphicons-halflings-regular.eot
│      glyphicons-halflings-regular.svg
│      glyphicons-halflings-regular.ttf
│      glyphicons-halflings-regular.woff
│
├─Models
│      AccountViewModels.cs
│      IdentityModels.cs
│
├─Properties
│      AssemblyInfo.cs
│
├─Scripts
│      bootstrap.js
│      bootstrap.min.js
│      jquery-1.10.2.intellisense.js
│      jquery-1.10.2.js
│      jquery-1.10.2.min.js
│      jquery-1.10.2.min.map
│      jquery.validate-vsdoc.js
│      jquery.validate.js
│      jquery.validate.min.js
│      jquery.validate.unobtrusive.js
│      jquery.validate.unobtrusive.min.js
│      modernizr-2.6.2.js
│      respond.js
│      respond.min.js
│      _references.js
│
└─Views
    │  Web.config
    │  _ViewStart.cshtml
    │
    ├─Account
    │      ConfirmEmail.cshtml
    │      ExternalLoginConfirmation.cshtml
    │      ExternalLoginFailure.cshtml
    │      ForgotPassword.cshtml
    │      ForgotPasswordConfirmation.cshtml
    │      Login.cshtml
    │      Manage.cshtml
    │      Register.cshtml
    │      ResetPassword.cshtml
    │      ResetPasswordConfirmation.cshtml
    │      _ChangePasswordPartial.cshtml
    │      _ExternalLoginsListPartial.cshtml
    │      _RemoveAccountPartial.cshtml
    │      _SetPasswordPartial.cshtml
    │
    ├─Home
    │      About.cshtml
    │      Contact.cshtml
    │      Index.cshtml
    │
    └─Shared
            Error.cshtml
            _Layout.cshtml
            _LoginPartial.cshtml

MVCなので当然『M:Models』『V:Views』『C:Controllers』となる。
単純な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』。


  • PostgreSQLへの接続。
EntityFramework6を使ってPostgreSQLへ接続するには、色々準備が必要。

メニューから[ツール]-[NuGetパッケージ マネージャー]-[ソリューションのNuGetパッケージの管理]を選択。
『NuGetパッケージの管理』ダイアログが開く。
左のツリーから『オンライン』を選択し、右上の『オンラインの検索』欄に『npgsql』と入力してしばらく待つ。
検索結果が表示されたら、『Npgsql for Entity Framework』をインストールする。
※『Npgsql』は自動で一緒にインストールされる。
対象のprojectの選択が出たら、必要なprojectを選択してやれば良い。

dotConnectのインストール。
メニューから[ツール]-[拡張機能と更新プログラム]を選択。
『拡張機能と更新プログラム』ダイアログの左側のツリーで『オンライン』を選択。
右上の『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付きでも無しでもほとんど変わらんハズ。

『dotConnect Express for PostgreSQL』をDatabase Providerとして登録する。

作成したプロジェクトの直下にある『Web.config』を開く。
[configuration]-[connectionStrings]の下に『add』を追加。具体的には下の例の4行目が追加されただけ。
『name』はDB接続class名にもなるので、そこら辺考慮して名付ける。『connectionString』の中は自分の環境に合わせてやってください。
※ココで軽くハマったんじゃが...DB名の大文字小文字違ってもPostgreSQLって許してくれんみたい。(´・ω・`)
e.g.) connectionStrings
  1. <connectionStrings>
  2. <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-GisWebApi-20141021085606.mdf;Initial Catalog=aspnet-GisWebApi-20141021085606;Integrated Security=True"
  3. providerName="System.Data.SqlClient" />
  4. <add name="PgContext" connectionString="Server=localhost; Port=5432; User Id=postgres; Password=password; Database=postgres; Encoding=UNICODE; Preload Reader=true;" providerName="Npgsql" />
  5. </connectionStrings>

EF6関係の設定部分。『Web.config』の下の方にある。
修正後で何が変わったかってぇと2行目の『defaultConnectionFactory』をPostgreSQL用に変えてる。8~12行目の『system.data』がごそっと追加。
5行目の『provider』にPostgreSQL用の設定が追加されてる。これはdotConnectの仕業なので、手動で追加しないように注意。
あと、なんたらnameって項目で出てきてる『Npgsql』ってキーワードはconnectionStrings含めて整合取らせてあげんといけんのんで注意ね。

+ e.g.) 【修正前】entityFramework
e.g.) 【修正前】entityFramework
  1. <entityFramework>
  2. <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
  3. <parameters>
  4. <parameter value="v11.0" />
  5. </parameters>
  6. </defaultConnectionFactory>
  7. <providers>
  8. <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  9. </providers>
  10. </entityFramework>
e.g.) 【修正後】entityFramework
  1. <entityFramework>
  2. <defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql" />
  3. <providers>
  4. <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  5. <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
  6. </providers>
  7. </entityFramework>
  8. <system.data>
  9. <DbProviderFactories>
  10. <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
  11. </DbProviderFactories>
  12. </system.data>

『Model』classの作成。

『Models』を右クリックして[追加]-[クラス]を選択。
  1. namespace Hoge.Models.dto
  2. {
  3. public class hage
  4. {
  5. [Key]
  6. public int id { get; set; }
  7. public string text { get; set; }
  8. public DateTime createDate { get; set; }
  9. public DateTime updateDate { get; set; }
  10. public string delflg { get; set; }
  11. }
  12. }

対応元のtableはこんな感じ。
  1. CREATE TABLE hoge.hage
  2. (
  3. id INTEGER NOT NULL DEFAULT NEXTVAL('hoge.hage_seq'::regclass),
  4. text CHARACTER VARYING,
  5. createDate TIMESTAMP WITHOUT TIME zone,
  6. createDate TIMESTAMP WITHOUT TIME zone,
  7. delflg CHARACTER(1) NOT NULL,
  8. CONSTRAINT movies_pkey PRIMARY KEY (id)
  9. )
  10. WITH (
  11. OIDS=FALSE
  12. );
  13. ALTER TABLE nbs1.movies
  14. OWNER TO nbs1;
  15.  






『DbContext』classの作成。

ソリューションエクスプローラーの『Models』を右クリックして[追加]-[新しい項目]を選択。
『新しい項目の追加』ダイアログで、左のツリーから『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にアクセスできる...のか?




更新日: 2015年12月25日 (金) 15時43分34秒

  • ありがとうございます。参考にさせていただきました! -- (名無しさん) 2018-01-29 14:53:24
名前:
コメント:

すべてのコメントを見る
記事メニュー
ウィキ募集バナー