2016-04-03 86 views
4

我在尝试将我的类型的属性映射到Cassandra中的映射时出现问题。F中的Cassandra CQL映射#

我有工作在C#,但我与F#挣扎

我得到的错误是:堆栈跟踪:[System.ArgumentOutOfRangeException:表达式x =>新Tuple`2(x.Id,ToFSharpFunc (x => x.WithName(“player_id”)))不是属性或字段。参数名称:表达式]

第26行,如果我删除了“fun(x:ColumnMap) - > x.WithName(”player_id“)”它会编译,但不会映射到正确的表列。我的模型属性名称是“ID”,但我需要它映射到“player_id”

open Cassandra 
open Cassandra.Mapping 
open System 

type Ranking = 
{ Id : Guid 
    Alias : string 
    Kills : int 
    Deaths : int } 

type Player = {Id: Guid; Alias: string; Dob: DateTime; FullName: string} 

type CassyMappings() = 
inherit Cassandra.Mapping.Mappings() 
do 
    base.For<Player>() 
      .TableName("players") 
      .PartitionKey("player_id") 
      .Column(fun(x:Player)-> x.Id) 
      .Column(fun(x:Player)-> x.Alias) 
      .Column(fun(x:Player)-> x.FullName) 
      .Column(fun(x:Player)-> x.Dob) |> ignore 
    base.For<Ranking>() 
     .TableName("rankings") 
     .PartitionKey("player_id") 
     .Column(fun (x : Ranking) -> x.Id, fun(x:ColumnMap)->x.WithName("player_id")) 
     .Column(fun (x : Ranking) -> x.Alias) 
     .Column(fun (x : Ranking) -> x.Kills) 
     .Column(fun (x : Ranking) -> x.Deaths) |> ignore 

MappingConfiguration.Global.Define<CassyMappings>() 

printfn "Works fine!" 

https://dotnetfiddle.net/8IiYhg

这里是将C#http://www.datastax.com/dev/blog/csharp-driver-cassandra-new-mapper-linq-improvements

+1

把你的代码在实际的问题。此外,请解释什么“挣扎与F#的意思” - 包括任何错误消息等 –

+0

当然,没问题..我创建了一个DotNetFiddle它[这里](https://dotnetfiddle.net/8IiYhg) 我的错误是“堆栈跟踪: [System.ArgumentOutOfRangeException:Expression x => new Tuple'2(x.Id,ToFSharpFunc(x => x.WithName(”player_id“)))不是属性或字段 参数名称:expression]“ –

+0

在第26行,如果我删除了”fun(x:ColumnMap) - > x.WithName(“player_id”)“它会编译但不会映射到正确的表列。我的模型属性名称是“Id”,但我需要它映射到“player_id” –

回答

3

你缺少括号的链接。

在线路26中的表达式得到编译为:

.Column(fun (x : Ranking) -> (x.Id, fun(x:ColumnMap)->x.WithName("player_id"))) 

即,作为取Ranking作为参数,并产生的int的元组和作为结果的函数的表达式。只是为了更清楚,这里是相同的代码的增强版本:

.Column(
    fun (x : Ranking) -> 
     let id = x.Id 
     let f = fun (x:ColumnMap)->x.WithName("player_id") 
     id, f) 

这样的表达式的结果是一个Tuple<_,_>和CQL解释需要一个简单的属性访问代替,而这正是它告诉你在错误信息中。

但你真的(显然)打算做的是调用一个不同的过载.Column,它需要两个参数,一个表达式和一个函数。为了防止编译器在考虑第二个功能与前一功能的身体的一部分,您只需要添加围绕这两个函数的括号:

.Column(
    (fun (x : Ranking) -> x.Id), 
    (fun (x:ColumnMap)->x.WithName("player_id"))) 

或者把它放在一个行:

.Column((fun (x : Ranking) -> x.Id), (fun (x:ColumnMap)->x.WithName("player_id"))) 
+0

很棒!谢谢你的解释 –