entity-framework - Entity Framework 兼容 POCO 的最短语法

标签 entity-framework f# 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

我以这种方式尝试过 CLIMutable:

module Program    

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

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

我还尝试过以下方法:

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

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

最佳答案

CLIMutable 属性对 F# 使用站点没有任何影响。添加的默认构造函数无法从 F# 用户代码访问,因此可变属性也是如此。如果您想使用 EF 更改跟踪(在 F# 内),记录不是一个好的选择(因为除非声明所有字段可变,否则您无法更改它)。 如果可能的话考虑使用例如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

关于entity-framework - Entity Framework 兼容 POCO 的最短语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40649919/

相关文章:

c# - 测试 Entity Framework 查找方法

c# - 如何选择要在 EF 中更新的特定字段

f# - 不考虑 if-else 表达式后的缩进变化?

c# - 在 C# 中序列化和存储对象的最简单方法?

sql-server - Docker 上的 Asp.Net Core + SQL Server - sleep 启动数据库

c# - 如何加快此 LINQ 查询的速度?

f# - 基于函数签名的模式匹配

azure - 缩小 Azure 上 FileLoadException 错误的范围

c# - 如何编写自定义 POCO 序列化器/反序列化器?

c# - 将派生属性包含到实体查询的 linq 中