gpt4 book ai didi

linq-to-sql - F# Linq To SQL 提交更改不会执行任何操作

转载 作者:行者123 更新时间:2023-12-02 21:52:32 24 4
gpt4 key购买 nike

我在 F# 中定义了以下类,其中包含 Linq 到 SQL 的映射属性:

[<Table(Name="Expense")>]
type public Expense(datetime : Nullable<DateTime>, value, category, comment) =
let mutable id = 0
let mutable datetime = if datetime.HasValue then datetime.Value else DateTime.Now
let mutable value = value
let mutable category = category
let mutable comment = comment
[<Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)>]
member x.ExpenseID with get() = id and set v = id <- v
[<Column>]
member x.DateTime with get() = datetime and set v = datetime <- v
[<Column>]
member x.Value with get() = value and set v = value <- v
[<Column>]
member x.Category with get() = category and set v = category <- v
[<Column>]
member x.Comment with get() = comment and set v = comment <- v
new() = Expense(nl, 0m, "", "")

然后我想使用以下代码(片段)插入该类型的新对象:

member private x.expenses = (new DataContext(connString)).GetTable<Expense>()
member x.Add (expense : Expense) =
x.expenses.InsertOnSubmit(expense)
x.expenses.Context.SubmitChanges()

调用 SubmitChanges() 不会执行任何操作,也不会引发任何异常。因此,我尝试检查是否存在 F# 对象,并且我已在 C# 中声明了具有完全相同映射的其他类。然后我就可以插入新记录了。现在我想知道,有什么区别?

进行了一些 Reflector 调查,唯一的区别是 C# 自动 getter/setter 上的属性 [CompilerGenerate],以及 F# 类上的 [Serialized] 和 CompilationMapping(SourceConstructFlags.ObjectType)]...它可能是其中之一吗?

反射器拆卸:http://pastebin.com/qTRfVcmm

//编辑

通过对 .NET 框架代码进行一些调试,我注意到 DataContext 实例的跟踪对象的内部列表在 InsertOnSubmit 和 SubmitChanges 调用之间不一致。在 SubmitChanges 调用开始时,此列表为空。这让我想到,这两个引用不是针对同一个 DataContext 实例,并且 VS 调试器证实了这一点。尽管如此,还是不​​知道为什么。

最佳答案

问题是第一次使用member 。 F# 成员(不带参数)的行为类似于属性,因此每次访问 x.expenses 时都会创建新的数据上下文。 。要更正该问题,您可以使用 let 将表对象存储在字段中。 :

type SomeType() =
let expenses = (new DataContext(connString)).GetTable<Expense>()
member x.Add (expense : Expense) =
expenses.InsertOnSubmit(expense)
expenses.Context.SubmitChanges()

member x.Foo = <expr> F# 中的语法对应于带有 getter 的属性,因此在 C# 语法中,您的原始代码将如下所示:

Table<Expenses> Expenses {
get { return (new DataContext(connString)).GetTable<Expense>(); }
}

...这解释了为什么创建了数据上下文的多个副本。

关于linq-to-sql - F# Linq To SQL 提交更改不会执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4802936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com