and*_*ask 7 .net c# sqlite datetimeoffset
在WinRT(Windows 8.1 Store App)项目中,我使用SQLite.Net-PCL和SQLiteNetExtensions NuGet包将数据存储在本地SQLite数据库文件中.
我的几个数据模型(也称为表)包含类型的属性DateTimeOffset.目的是在不丢失偏移信息的情况下存储这些信息.(原因是用户可以在指定日期/时间时输入时区信息,并且此信息必须存储在数据库中.)
我知道storeDateTimeAsTicks在创建时可以设置的参数,将其设置SQLiteConnection为false强制所有DateTime属性都以ISO格式存储为文本 - 但是,这对DateTimeOffset属性没有影响,因为它们总是自动转换为UTC并存储为代表刻度的数字.
我可以想到以下4种方法:
DateTimeOffset为string属性并存储这些,或DateTime和偏移(作为TimeSpan日期类型)的部分DateTimeOffset,并将它们存储在两个单独的列中,=>但对于这两种方法,我需要向数据模型添加其他属性,DateTimeOffset使用[Ignore]属性标记原始属性,并处理手动转换(在两个方向上) - 因为我需要将其应用于大量不同的数据模型类,似乎太难维护.
DateTime和TimeSpan(偏移)部分DateTimeOffset,并维护对此单独表的引用=>但在这种情况下我需要定义一个自定义数据类型(为了指定应该如何存储DateTime和TimeSpan部分),并且不能使用默认的.NET DateTimeOffset类型
TextBlob属性以某种方式将序列化为DateTimeOffset单个文本列=>但这感觉有点hacky,我需要确保只有SQLiteNetExtensions的扩展方法用于数据库插入/更新,我仍然需要string在所有数据模型类上有一个额外的属性...
所以,我的问题是:我是否缺少一个更为直接,明显的解决方案?
由于没有人提出可能的解决方案,但问题仍然引起了一些关注,我决定报告我是如何解决问题的:
方法#1:
引发原始问题的场景包括一个由以下内容组成的移动应用程序
API模型和数据库模型几乎相同(除了JSON序列化和SQLite OR映射所需的属性),唯一的结构差异是表示日期/时间的属性string在API类和DateTimeOffsetDB类中是类型.从中下载数据之后,在将数据上传到后端之前,使用Automapper将API和DB模型相互转换.
我只是从Automapper配置中删除了stringto DateTimeOffset转换,并修改了DB数据模型类,以便将DateTimeOffset值表示为string,这意味着它们在SQLite中存储为格式化文本(幸运的是,不需要在DB层上进行日期/时间计算).由于从后端接收的JSON对象包含时区信息,因此我可以简单地将这些值传递给数据库模型,从而确保数据库表始终包含日期/时间作为完全格式化的日期时间字符串,包括时区偏移量.
从转换string到DateTimeOffset创建视图模型班列DB数据模型的时候,现在情况发生.显然,这种情况比以前更频繁(将API模型转换为数据库模型时)会产生一些开销,但我可以忍受这种情况,因为我不再需要担心SQLite数据类型问题了.
方法#2:
由于方法#1可能不适用于所有方案,我提出了一个替代解决方案,该解决方案基于原始问题中提出的4个潜在解决方案中的第一个,但减少了手动工作:
我创建了一个[DateTimeOffsetSerialize]可以分配给DateTimeOffsetSQLite数据模型类中的属性的自定义属性,以及一个在构建完成后反编译程序集的postbuild任务,并扫描程序集中的所有类以查找这些标记的属性.对于这些标记属性中的每一个,将string自动创建包含原始属性的序列化值的类型的重复属性,并且此新创建的string属性将用作SQLite表列(原始DateTimeOffset属性将自动使用该[Ignore]属性标记).
此解决方案以NuGet包的形式提供,并且已在GitHub上开源(GitHub页面还包含详细的使用说明).