实体框架兼容POCO的最短语法

ale*_*hro 2 f# entity-framework poco

我需要F#与Entity Framework一起使用.我试图从这里改编示例:https://blogs.msdn.microsoft.com/visualstudio/2011/04/04/f-code-first-development-with-entity-framework-4-1/ 问题是那个记录声明在那里太可怕了,这对我来说是不可接受的.

type public Car() =
    let mutable m_ID : int = 0
    let mutable m_name : string = ""

    [<Key>]
    member public this.ID        with    get()   = m_ID
                                 and     set v   = m_ID <- v
    member public this.Name      with    get()   = m_name
                                 and     set v   = m_name <- v
Run Code Online (Sandbox Code Playgroud)

我以这种方式尝试过CLIMutable:

module Program    

[<CLIMutable>]
type Car = {        
    Name:string        
}        
let c = new Car(Name = "Honda")
Run Code Online (Sandbox Code Playgroud)

它会导致错误:"没有可用于'Car'类型的构造函数".据我所知,这个答案可能是一个解释:https: //stackoverflow.com/a/28845368/585819

我也尝试过这样的事情:

[<CLIMutable>]
type Car = 
    { 
    ID:int        
    } member this.Name = ""
Run Code Online (Sandbox Code Playgroud)

错误是一样的.我感到非常失望.有人可以帮忙吗?

Car*_*Dev 5

CLIMutable属性对F#use-sites没有任何影响.添加的默认构造函数不能从F#用户代码访问,因此是可变属性.如果要使用EFs更改跟踪(在F#中),记录不是一个好的选择(因为除非声明所有字段,否则不能更改它mutable).如果可能,请考虑使用例如SQL提供程序.另一方面,例如Dapper支持序列化/反序列化POCO,从而支持F#记录.

由于记录在F#透视图中看起来不可变,因此常规构造适用:

let c = { Name = "Honda" }
Run Code Online (Sandbox Code Playgroud)

或者(如果你也有例子,则消除歧义type Person = { Name : string })

let c = { Car.Name = "Honda" }
let c : Car = { Name = "Honda" }
let c = { Name = "Honda" } : Car
Run Code Online (Sandbox Code Playgroud)