EFCore.FSharp 발표

11641 단어 sqlfsharpdotnetefcore


오늘은 Entity Framework Core에 대한 F# 지원의 첫 번째 알파 릴리스로, EF Core 5.0.3을 지원하는 F# 프로젝트에서 EF Core를 직접 사용할 수 있습니다.
여기에는 마이그레이션 및 리버스 엔지니어링에 대한 지원이 포함되어 테이블을 F# 레코드에 매핑하고 option와 같은 F# 관용구를 활용하여 null 허용 열을 나타낼 수 있습니다. 그러나 현재로서는 기본 또는 외래 키에 대해서는 작동하지 않으며 일반 열( GitHub issue )에만 작동합니다.

테스트 드라이브로 가져가려면 https://www.nuget.org/packages/EntityFrameworkCore.FSharp에서 NuGet 패키지를 가져옵니다.
알파 릴리스이므로 GitHub repo에 문제를 기록하십시오.

현재 비교적 간단한 스키마를 지원하며 테이블당 다유형 관계는 아직 지원하지 않지만 on the to-do list 입니다.

option을 지원하지만 식별된 통합과 같은 유형은 아직 지원하지 않습니다.

설치



NuGet 패키지를 가져오는 모든 일반적인 방법...
Install-Package EntityFramworkCore.FSharpdotnet add package EntityFramworkCore.FSharppaket install EntityFramworkCore.FSharp

용법



설치되면 dotnet ef에 등록해야 수령할 수 있습니다. 프로젝트에 다음 코드를 추가하기만 하면 됩니다. 컴파일 시간에 감지되며 Startup 클래스에서 호출할 필요가 없습니다.



module DesignTimeServices

open Microsoft.Extensions.DependencyInjection
open Microsoft.EntityFrameworkCore.Design
open EntityFrameworkCore.FSharp

type DesignTimeServices() =
    interface IDesignTimeServices with 
        member __.ConfigureDesignTimeServices(serviceCollection: IServiceCollection) = 
            let fSharpServices = EFCoreFSharpServices.Default
            fSharpServices.ConfigureDesignTimeServices serviceCollection
            ()



마이그레이션

코드 우선 데이터베이스가 지원되며 사용자 인증을 사용하여 F#에서 기본 MVC 응용 프로그램을 만드는 작업 예제는 https://github.com/simon-reynolds/EFCore.FSharp.MvcAuth에서 사용할 수 있습니다.

한 가지 기억해야 할 점은 레코드 유형이 Entity Framework에서 올바르게 생성될 수 있도록 지정된 [<CliMutable>] 특성을 가져야 한다는 것입니다.

실행 후dotnet ef migration add 생성된 파일을 프로젝트에 추가해야 합니다. 마이그레이션 파일은 순차적으로 생성되므로 fsproj 파일에 단일 glob 참조를 추가하여 한 번에 모두 추가할 수 있습니다.



<Compile Include="Migrations/*.fs" />



자동화된 솔루션을 찾기 위해 이를 추적하는 issue이 있습니다. 언제나처럼 어떤 도움이나 제안도 환영합니다.

발판



기존 데이터베이스에서 모델을 스캐폴딩할 때 위의 DesignTimeServices 유형에서 생성된 코드를 생성하는 방법을 지정할 수 있습니다.

레코드 유형 또는 C#에서 작동하는 방식과 유사한 클래스로 유형을 생성할 수 있습니다.

예를 들어 ID, 제목 및 콘텐츠가 있는 블로그 게시물 유형이 주어지면 아래 예 중 하나로 생성될 수 있습니다.



// Record type
type BlogPost = {
    Id : int
    Title: string
    Content: string
}

// Class type
type BlogPost() =

    [<DefaultValue>] val mutable private _Id : int
    member this.Id with get() = this._Id and set v = this._Id <- v

    [<DefaultValue>] val mutable private _Title : string
    member this.Title with get() = this._Title and set v = this._Title <- v

    [<DefaultValue>] val mutable private _Content : string
    member this.Content with get() = this._Content and set v = this._Content <- v



마찬가지로 선택적 열은 Nullable<'a> 또는 'a option 로 렌더링될 수 있습니다. 기본 구성은 option 유형으로 지정된 null 허용 열이 있는 레코드 유형을 생성합니다.

이는 스캐폴드 옵션을 정의하고 DesignTimeServices 에 전달함으로써 이루어집니다.



module DesignTimeServices =

    open Microsoft.Extensions.DependencyInjection
    open Microsoft.EntityFrameworkCore.Design
    open EntityFrameworkCore.FSharp

    type DesignTimeServices() =
        interface IDesignTimeServices with
            member __.ConfigureDesignTimeServices(serviceCollection: IServiceCollection) =

                // The default behaviour can be specified by calling
                let fSharpServices = EFCoreFSharpServices.Default

                // Or we can define a ScaffoldOptions use that instead
                let scaffoldOptions =
                    ScaffoldOptions (
                        ScaffoldTypesAs = ScaffoldTypesAs.ClassType,
                        ScaffoldNullableColumnsAs = ScaffoldNullableColumnsAs.NullableTypes)

                let fSharpServices = EFCoreFSharpServices.WithScaffoldOptions scaffoldOptions

                fSharpServices.ConfigureDesignTimeServices serviceCollection
                ()



자세한 내용은 프로젝트 문서here에서 확인할 수 있습니다.

옵션 유형



null 허용 열을 옵션에 매핑하기 위한 option를 포함하여 OptionConverter 유형에 대한 기본 지원이 있습니다. 코드 우선 데이터베이스를 구축할 때 OnModelCreating 끝에 다음을 포함하기만 하면 됩니다.

type MyContext (options) = 
    inherit DbContext (options)

    override this.OnModelCreating mb =
        (* Define entities here *)

        modelBuilder.RegisterOptionTypes()


다른 문제



나는 확신합니다. 발견한 모든 문제를 보고하고 Entity Framework Core에 대한 F# 지원을 개선할 수 있도록 도와주세요!

좋은 웹페이지 즐겨찾기