在 WinRT(Windows 8.1 商店应用程序)项目中,我使用 SQLite.Net-PCL 和 SQLiteNetExtensions NuGet 包将数据存储在本地 SQLite 数据库文件中。
我的几个数据模型(又名表)包含 DateTimeOffset 类型的属性。目的是存储这些而不丢失偏移量信息。 (这是因为用户可以在指定日期/时间的同时输入时区信息,而这些信息必须存储在数据库中。)
我知道在创建 SQLiteConnection 时可以设置 storeDateTimeAsTicks 参数,将其设置为 false 会强制所有 DateTime 属性以 ISO 格式存储为文本 - 但是,这对 DateTimeOffset 属性没有影响,因为这些属性总是自动转换为 UTC 并存储为表示刻度的数字。
我可以想到以下4种方法:
DateTimeOffset 转换为 string 属性并存储它们,或者DateTimeOffset 的 DateTime 和偏移量(作为 TimeSpan 日期类型)部分,并将它们存储在两个单独的列中,=> 但对于这两种方法,我都需要向数据模型添加其他属性,使用 [Ignore] 属性标记原始 DateTimeOffset 属性,以及处理手动转换(双向)- 因为我需要将其应用于许多不同的数据模型类,所以它似乎很难维护。
DateTimeOffset 的 DateTime 和 TimeSpan(偏移量)部分存储在单独表的两列中,并维护对此单独表的引用表=> 但在这种情况下,我需要定义自定义数据类型(以指定应如何存储 DateTime 和 TimeSpan 部分),以及不能使用默认的 .NET DateTimeOffset 类型
TextBlob 属性以某种方式将 DateTimeOffset 序列化为单个文本列=> 但这感觉有点老套,我需要确保只有 SQLiteNetExtensions 的扩展方法用于数据库插入/更新,而且我仍然需要一个额外的 string 属性所有的数据模型类...
那么,我的问题是:是否有我缺少的更直接、更明显的解决方案?
最佳答案
由于没有人提出可能的解决方案,但这个问题仍然受到了一些关注,我决定报告一下我是如何解决这个问题的:
方法 #1:
提出最初问题的场景包括一个移动应用程序,该应用程序包含
API 模型和 DB 模型几乎相同(JSON 序列化和 SQLite OR 映射所必需的属性除外),唯一的结构差异是表示日期/时间的属性在 API 中是 string 类型数据库类中的类和 DateTimeOffset。从后端下载数据后,上传数据到后端之前,使用Automapper 将API 和DB 模型相互转换。
我只是从 Automapper 配置中删除了 string 到 DateTimeOffset 的转换,并修改了 DB 数据模型类,以便表示 DateTimeOffset 值作为 string,这意味着它们在 SQLite 中存储为格式化文本(幸运的是,不需要在 DB 层上进行日期/时间计算)。由于从后端收到的 JSON 对象包含时区信息,我可以简单地将这些值传递给数据库模型,从而确保数据库表始终包含日期/时间作为包括时区偏移在内的完全格式化的日期时间字符串。
从数据库数据模型创建 ViewModel 类时,现在会发生从 string 到 DateTimeOffset 的转换。显然,这种情况比以前更频繁地发生(当将 API 模型转换为数据库模型时),导致一些开销,但我可以接受,因为我不再需要担心 SQLite 数据类型问题。
方法 #2:
由于方法 #1 可能并不适用于所有情况,我想出了一个替代解决方案,它基于原始问题中提出的 4 个潜在解决方案中的第一个,但减少了手动工作量:
我创建了一个自定义属性 [DateTimeOffsetSerialize] 可以分配给 SQLite 数据模型类中的 DateTimeOffset 属性,以及一个在构建完成后反编译程序集的构建后任务并扫描程序集中的所有类以查找那些标记的属性。对于这些标记的属性中的每一个,都会自动创建一个类型为 string 的重复属性,其中包含原始属性的序列化值,并且这个新创建的 string 属性将用作 SQLite 表列(原始 DateTimeOffset 属性自动标记为 [Ignore] 属性)。
此解决方案可用 NuGet package ,并且一直是open-sourced on GitHub (GitHub 页面还包含详细的使用说明)。
关于c# - 在 SQLite.Net 中存储 DateTimeOffset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41983978/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于