带有F#的ServiceStack.Redis不存储数据.但是C#中的代码几乎相同

mlu*_*iak 7 c# f# redis c#-to-f# servicestack

今晚我和F#和redis一起玩.我正在使用ServiceStack.redis连接到在localhost上运行的MSOpenTech redis.出于测试目的,我试图用这样的代码将比特币的价格保存到redis中:

let redis = new RedisClient("localhost")
redis.FlushAll()

let redisBitstamp = redis.As<BitstampLast>()
let last = {Id = redisBitstamp.GetNextSequence(); Timestamp = 1386459953; Value=714.33M}
redisBitstamp.Store(last)

let allValues = redisBitstamp.GetAll()
allValues.PrintDump()
Run Code Online (Sandbox Code Playgroud)

不幸的是,PrintDump的结果是:

[
    {
            __type: "Program+BitstampLast, RedisSave",
            Id: 0,
            Timestamp: 0,
            Value: 0
    }
]
Run Code Online (Sandbox Code Playgroud)

出于测试目的,我在同一个redis实例上的C#中运行了几乎相同的代码:

class BitstampLast
{
    public Int64 Id { get; set; }
    public int Timestamp { get; set; }
    public decimal Value { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var redis = new RedisClient("localhost");
        redis.FlushAll();

        var redisBitstamp = redis.As<BitstampLast>();
        var last = new BitstampLast() {Id = redisBitstamp.GetNextSequence(), Timestamp = 1386459953, Value=714.33M};
        redisBitstamp.Store(last);

        var allValues = redisBitstamp.GetAll();
        allValues.PrintDump();

    }
}
Run Code Online (Sandbox Code Playgroud)

结果......

[
    {
            __type: "CSharpRedis.BitstampLast, CSharpRedis",
            Id: 1,
            Timestamp: 1386459953,
            Value: 714.33
    }
]
Run Code Online (Sandbox Code Playgroud)

那么,我错过了什么?为什么它在C#中工作,而在F#中不起作用?

编辑:BitstampLast的定义方式如下:

type BitstampLast = {Id:int64; Timestamp:int; Value:decimal}
Run Code Online (Sandbox Code Playgroud)

这是错的,因为它应该是:

type BitstampLast = {mutable Id:int64; mutable Timestamp:int; mutable Value:decimal}
Run Code Online (Sandbox Code Playgroud)

现在它有效.接下来的问题 - 为什么它应该是可变的?redis有些混乱了这个对象吗?

myt*_*thz 14

许多ServiceStack的库(例如,序列化,自动映射等)都在POCO上工作,这些POCO具有默认构造函数和可写属性,F#immutable record默认情况下没有这些属性.

在F#中创建POCO的最好方法是使用CLIMutable属性F#3.0语言功能来装饰它,该属性创建一个POCO类型,其中包含可在C#代码中访问的所有属性的公共getter和setter,但仍然在F#中表现为不可变类型,例如:

[<CLIMutable>] 
type BitstampLast = { Id:int64; Timestamp:int; Value:decimal }
Run Code Online (Sandbox Code Playgroud)