F# 在高阶函数中使用 EF 保存数据

F# Save Data with EF in High Order Function

我正在使用 F# 高阶函数创建项目并将其插入到数据库中。我一直被抛出一个异常,说我正在尝试将 0 个项目保存到我的数据库中,但我显然是在将项目添加到上下文中然后保存。检查 db.WordRelations.Local 属性 显示 728 个项目(none 其中远程存在)。

let CreateWordRelationDB () =
    let db = new AnnotatorModel()
    printfn "%s" "Entered Function and created db v8"
    let tweets = db.Tweets.ToList() |> Seq.map(fun t -> t.Text)
    let words = db.Words.ToList() |> Seq.map(fun w -> w)
    words 
    |> Seq.fold(fun acc w1 ->  
                        let filtacc = acc 
                                      |> Seq.filter(fun (w2:Word) -> 
                                                        if(w1.Text = w2.Text) then false else true)
                        let adds = filtacc 
                                    |> Seq.map(fun w2 -> CreateWordRelation w1 w2 tweets)
                        db.WordRelations.AddRange(adds) |> ignore
                        try 
                            db.SaveChanges() |> ignore
                        with error -> 
                                printfn "%s" error.Message
                        filtacc
                    ) words
    |> ignore

db.SaveChanges() 在我身上不断失败。您可以在其上方看到 db.WordRelations.AddRange(adds)。每次迭代此数量都会减少,但从 728 开始,然后是 727,然后是 726 等等,直到 0。

有什么想法吗?

似乎出于某种原因,在我的特定实例中,SQL Azure 或 Entity Framework v6.1 不喜欢我的主键是计算列,它是通过采用第一个词和第二个词的 ID 并将它们连接在一起。

更改要调用的 ID "PairId" 并将 ID 设为 Int IDENTITY 列似乎已解决所有问题...

如果有人想对根本原因发表评论,我会非常想知道这些答案。