【问题标题】:Shortest syntax for Entity Framework compatible POCO实体框架兼容 POCO 的最短语法
【发布时间】:2016-11-18 23:19:13
【问题描述】:

我需要 F# 来轻松地使用实体框架。我正在尝试从这里改编示例: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

我曾以这种方式尝试过 CLIMutable:

module Program    

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

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

我也尝试过:

[<CLIMutable>]
type Car = 
    { 
    ID:int        
    } member this.Name = ""

错误是一样的。我真的感到很失望。有人可以帮忙吗?

【问题讨论】:

  • 我通常做的是在一个单独的项目中创建我的 POCO 类和 DbContext。这样我也可以利用代码优先迁移。
  • @OJRaqueño 我尝试将它们放在单独的项目(库)中。但错误是一样的。我不知道,可能需要一些特殊的编译选项。

标签: entity-framework f# poco


【解决方案1】:

CLIMutable 属性对 F# 使用站点没有任何影响。添加的默认构造函数无法从 F# 用户代码访问,可变属性也是如此。如果您想使用 EF 更改跟踪(从 F# 中),记录不是一个好的选择(因为除非您声明所有字段 mutable,否则您无法更改它)。 如果可能,请考虑使用例如SQL Provider。另一方面,例如Dapper 支持序列化/反序列化 POCO,因此支持 F# 记录。

从 F# 的角度来看,记录看起来是不可变的,因此适用常规构造:

let c = { Name = "Honda" }

或(为了消除歧义,如果您也有例如type Person = { Name : string }

let c = { Car.Name = "Honda" }
let c : Car = { Name = "Honda" }
let c = { Name = "Honda" } : Car

【讨论】:

  • 我不需要 EF 更改跟踪。我想使用 EF 的唯一原因是它从 POCO 创建数据库模式。我还没有找到任何替代工具。
【解决方案2】:

这似乎对我有用。这不是记录,而是课堂。也可能不能命名为 POCO。

//file DataModel.fs
module DataModel
open System.ComponentModel.DataAnnotations
open System.Data.Entity
type Car()=
    [<Key>]
    member val Id = 0 with get,set
    member val Name = "" with get,set

type public CLCars() =
    inherit  DbContext()
    member val Cars: DbSet<Car> = base.Set<Car>() with get,set

//file Program.fs
module Program
open DataModel   

   let db = new CLCars()
   let c = new Car(Name="Honda")
   db.Cars.Add(c) |> ignore
   db.SaveChanges() |> ignore

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 2012-03-08
    • 1970-01-01
    • 2012-03-22
    • 2011-03-04
    • 2016-03-17
    • 2016-01-28
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多