ServiceStack Ormlite-Postgres序列化日期属性,将MaxDate转换为JsonB

ServiceStack Ormlite-Postgres序列化日期属性,将MaxDate转换为JsonB,
Warning: implode(): Invalid arguments passed in /data/phpspider/zhask/webroot/tpl/detail.html on line 45
,,我有一个复杂的对象,我使用Ormlite保存到postgres中的JsonB字段中。 其中一个属性是DateTime,并设置为DateTime.Max 从Postgres检索对象DateTime属性值设置为DateTime.Min值 01/01/0001 00:00:00 不确定这是Ormlite还是json序列化程序的错误 要复制的代码段 class Program { static void Main(string[] args) { var item =

我有一个复杂的对象,我使用Ormlite保存到postgres中的JsonB字段中。 其中一个属性是DateTime,并设置为DateTime.Max

从Postgres检索对象DateTime属性值设置为DateTime.Min值

01/01/0001 00:00:00
不确定这是Ormlite还是json序列化程序的错误

要复制的代码段

class Program
{
    static void Main(string[] args)
    {
        var item = new LicenseCheckTemp();
        item.Body = new CheckHistory();
        item.Body.List.Add(new ItemHistory() {AddedOn = DateTime.MaxValue, Note = "Test"});

        var factory = GetFactory(ConfigurationManager.AppSettings["PostgresConnectionString"]);
        using (var db = factory.OpenDbConnection())
        {
            db.CreateTableIfNotExists<LicenseCheckTemp>();
            db.Save(item);
        }

        using (var db = factory.OpenDbConnection())
        {
          var items =  db.Select<LicenseCheckTemp>();

            foreach (var licenseCheck in items.OrderBy(x=>x.Id))
            {
                if (licenseCheck.Body != null && licenseCheck.Body.List.Any())
                {
                    foreach (var itemHistory in licenseCheck.Body.List)
                    {
                        Console.WriteLine($"{itemHistory.AddedOn} :  Note {itemHistory.Note}");
                    }

                }

            }
        }

        Console.ReadKey();


    }


    public static IDbConnectionFactory GetFactory(string connection)
    {
        var factory = new OrmLiteConnectionFactory(connection,
           PostgreSqlDialect.Provider);

        factory.DialectProvider.NamingStrategy = new OrmLiteNamingStrategyBase();

        return factory;
    }
}

public class LicenseCheckTemp
{
    [AutoIncrement]
    public int Id { get; set; }

    [CustomField("json")]
    public CheckHistory Body { get; set; }
}

public class CheckHistory
{
    public List<ItemHistory> List { get; set; } = new List<ItemHistory>();
}

public class ItemHistory
{
    public string Note { get; set; }

    public DateTime AddedOn { get; set; }

}
类程序
{
静态void Main(字符串[]参数)
{
var item=新的LicenseCheckTemp();
item.Body=新的CheckHistory();
item.Body.List.Add(newitemHistory(){AddedOn=DateTime.MaxValue,Note=“Test”});
var factory=GetFactory(ConfigurationManager.AppSettings[“PostgresConnectionString”]);
使用(var db=factory.OpenDbConnection())
{
db.CreateTableIfNotExists();
db.Save(项目);
}
使用(var db=factory.OpenDbConnection())
{
var items=db.Select();
foreach(var许可签入items.OrderBy(x=>x.Id))
{
if(licenseCheck.Body!=null&&licenseCheck.Body.List.Any())
{
foreach(licenseCheck.Body.List中的var itemHistory)
{
WriteLine($“{itemHistory.AddedOn}:Note{itemHistory.Note}”);
}
}
}
}
Console.ReadKey();
}
公共静态IDbConnectionFactory GetFactory(字符串连接)
{
var工厂=新的OrmLiteConnectionFactory(连接,
PostgreSqlDialogue.Provider);
factory.DialogProvider.NamingStrategy=new或mlitenamingStrategybase();
返回工厂;
}
}
公共类LicenseCheckTemp
{
[自动增量]
公共int Id{get;set;}
[自定义字段(“json”)]
公共CheckHistory主体{get;set;}
}
公共类检查历史记录
{
公共列表列表{get;set;}=new List();
}
公共类项目历史记录
{
公共字符串注释{get;set;}
公共日期时间加法器{get;set;}
}

虽然OrmLite没有对PostgreSQL JSON数据类型的明确支持,但OrmLite对ComplexType属性的现有JSON序列化应该允许它正常工作,如下所示:

我添加了以下示例:

显示CreateTable为Body属性创建一个“json”类型,该行被序列化并返回完全填充


无法重新编程为什么它不适用于您,您是否正在使用OrmLite的最新v4.0.54版本?它适用于较小的日期时间吗?(可能时区中的最大日期时间超过了PgSql配置实例支持的时间)。

请发布显示此问题的确切源代码。您好,mythz,添加了代码片段我正在使用PostgreSQL 9.5的4.0.54版本。查看您的打印输出,PostgreSQL中存储的日期与{“List”:[{“Note”:“Test”,“AddedOn”:“\/date(253402300800000-0000)\/”}]看起来不一样。我假设存储日期的方式是标准的,是否有其他设置可以像您的输出一样获取日期?@laitang没有标准的方式在JSON、ServiceStack中存储日期。文本默认为WCF JSON日期。您可以使用
JsConfig.DateHandler=…
和任何“谢谢”命令更改默认的日期格式!改为JsConfig.DateHandler=DateHandler.ISO8601就解决了这个问题。
OrmLiteConfig.DialectProvider.NamingStrategy = new OrmLiteNamingStrategyBase();

var item = new LicenseCheckTemp();
item.Body = new CheckHistory();
item.Body.List.Add(new ItemHistory { AddedOn = DateTime.MaxValue, Note = "Test" });

using (var db = OpenDbConnection())
{
    db.DropAndCreateTable<LicenseCheckTemp>();
    db.GetLastSql().Print();
    db.Save(item);
}

using (var db = OpenDbConnection())
{
    var items = db.Select<LicenseCheckTemp>();
    items.PrintDump();

    foreach (var licenseCheck in items.OrderBy(x => x.Id))
    {
        if (licenseCheck.Body != null && licenseCheck.Body.List.Any())
        {
            foreach (var itemHistory in licenseCheck.Body.List)
            {
                $"{itemHistory.AddedOn} :  Note {itemHistory.Note}".Print();
            }
        }
    }
}
CREATE TABLE "LicenseCheckTemp" 
(
  "Id" INTEGER PRIMARY KEY AUTOINCREMENT, 
  "Body" json NULL 
); 

[
    {
        Id: 1,
        Body: 
        {
            List: 
            [
                {
                    Note: Test,
                    AddedOn: 9999-12-31T23:59:59.9999999-05:00
                }
            ]
        }
    }
]
12/31/9999 11:59:59 PM :  Note Test