ServiceStack Ormlite-Postgres序列化日期属性,将MaxDate转换为JsonB
我有一个复杂的对象,我使用Ormlite保存到postgres中的JsonB字段中。 其中一个属性是DateTime,并设置为DateTime.Max 从Postgres检索对象DateTime属性值设置为DateTime.Min值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 =
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