【F# + ASP.NET MVC】 Entity Frameworkコード・ファーストでモデル開発するには

◆Web.config

<?xml version="1.0"?>
<configuration>
  <!-- 省略 -->
  <connectionStrings>
    <add name="EduContext"
         connectionString="Data Source=|DataDirectory|SampleDatabase.sdf"
         providerName="System.Data.SqlServerCe.4.0"/>
  </connectionStrings>
</configuration>

◆Global.fs

namespace MsdnWeb.Routing

open System
open System.Web
open System.Web.Mvc
open System.Web.Routing
open System.Data.Entity

open MsdnWeb.Entities

type Route = { controller : string
               action : string
               id : UrlParameter }

type Global() =
    inherit System.Web.HttpApplication() 

    static member RegisterRoutes(routes:RouteCollection) =
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
        routes.MapRoute("Default",
                        "{controller}/{action}/{id}",
                        { controller = "Home"; action = "Index"
                          id = UrlParameter.Optional } )

    member this.Start() =
        // DBの初期化
        Database.SetInitializer(
            DropCreateDatabaseIfModelChanges<EduContext>())
        AreaRegistration.RegisterAllAreas()
        Global.RegisterRoutes(RouteTable.Routes)

◆Entity

namespace MsdnWeb.Entities

open System.Data.Entity

type Employee() =

    let mutable id = 0
    let mutable name = ""

    member x.ID
        with get() = id
        and set v = id <- v

    member x.Name
        with get() = name
        and set v = name <- v

type EduContext() =
    inherit DbContext()

    [<DefaultValue>]
    val mutable employee : IDbSet<Employee>

    member public x.Employees
        with get() = x.employee
        and set v = x.employee <- v

◆Model

namespace MsdnWeb.Models

// #r "System.Data"
// #r "System.Data.Entity"
// #r "EntityFramework"
open System.Data.Entity
open System.Collections.Generic
open System.Linq

open MsdnWeb.Entities

type HomeModel() =
    member this.Index () =
        use ctx = new EduContext()

        // 初期データの作成
        ctx.Employees.Add(Employee(Name = "Taro")) |> ignore
        let updateCount = ctx.SaveChanges()        

        ctx.Employees.Load()
        ctx.Employees.ToList() :> IEnumerable<Employee>

◆Controller

namespace MsdnWeb.Controllers

open System.Web
open System.Web.Mvc

open MsdnWeb.Models 

type HomeController() =
    inherit Controller()
    member this.Index (model:HomeModel) =
        this.View(model.Index()) :> ActionResult

◆View

@model IEnumerable<MsdnWeb.Entities.Employee>
           
@{ Layout = null; }

<!DOCTYPE html>
<html>
<head>
    <title>F# + Entity Framework</title>
</head>
<body>
    <div>
        <table>
            <tr>
                <th>ID</th>
                <th>Name</th>
            </tr>
            @foreach (var item in Model)
            { 
            <tr>
                <td>@Html.DisplayFor(modelItem => item.ID)</td>
                <td>@Html.DisplayFor(modelItem => item.Name)</td>
            </tr>
            }
        </table>
    </div>
</body>
</html>

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中