在Json.NET中,如何在反序列化时使所有属性成为必需?我知道我可以使用消息上的属性来执行此操作,但我不想这样做.主要是因为它需要我的消息库来承担外部依赖.
我尝试了MissingMemberHandling.Error设置,但它与我想要的完全相反.我对JSON有额外的属性没关系.我希望它在JSON中缺少任何目标对象属性时失败.
我实际上反序列化为F#记录,无论如何,属性通常不能为null.(它们不能通过代码中的常规方式赋值为null.)但是当数据丢失时,Json.NET很乐意将属性默认为null.
接受答案的F#版本
分解器
open System
open Newtonsoft.Json
open Newtonsoft.Json.Serialization
type RequireAllPropertiesContractResolver() =
inherit DefaultContractResolver()
override me.CreateObjectContract(objectType:Type) =
let contract = base.CreateObjectContract(objectType)
contract.ItemRequired <- new Nullable<Required>(Required.Always)
contract
Run Code Online (Sandbox Code Playgroud)
在设置中
let settings = new JsonSerializerSettings() // default settings
...
settings.ContractResolver <- new RequireAllPropertiesContractResolver()
Run Code Online (Sandbox Code Playgroud) 这就是问题所在。在 MySQL 的 Connector/NET 中,TINYINT(1)字段正确地来回转换为 .NET bool 值。如果我从带有一TINYINT(1)列的表中进行选择,则一切都是金色的。但是,当您使用内置 MySQL v5.0 函数时,例如:
SELECT (3 BETWEEN 2 AND 4) AS oddly_not_boolean;
Run Code Online (Sandbox Code Playgroud)
数据库的实际返回类型将此字段注册为INTor BIGINT,Connector/.NET 显然不会将其转换为 bool。MySQLCAST()并且CONVERT()不允许强制转换为TINYINT(1).
我什至尝试使用用户功能来做到这一点, 但这也不起作用(编辑:这确实有效):
CREATE FUNCTION `to_bool`(var_num BIGINT)
RETURNS TINYINT(1) RETURN var_num;
Run Code Online (Sandbox Code Playgroud)
如何在 MySQL 中的查询中将an 转换INT为 a TINYINT(1)?
编辑:上面的函数确实可以将值转换为 a TINYINT(1),但我的连接器/NET 只是被窃听,无法正确转换函数中的值。
2009 年 11 月 3 日更新:更新了我的连接器,它仍然返回 Int32。进一步测试表明,这是MySQL 5.0.x 中的InnoDB 错误,仅在特定情况下才会显示。
编辑:根据测试更新了问题描述 - 2011年9月12日.
我有这个查询,每当我调用.ToList()时抛出NotSupportedException("不支持指定的方法.").
IQueryable<FileDefinition> query = db
.FileDefinitions
.Include(x => x.DefinitionChangeLogs)
.Include(x => x.FieldDefinitions.Select(y => y.DefinitionChangeLogs)) // bad
.Include(x => x.FieldDefinitions.Select(y => y.FieldValidationTables)) // bad
.Where(x => x.IsActive);
List<FileDefinition> retval = query.ToList();
Run Code Online (Sandbox Code Playgroud)
如果我注释掉我评论为"坏"的任一行,那么查询就可以了.我也尝试在我的对象模型中包含不同的嵌套实体,效果相同.包括任何2将导致崩溃.嵌套,我的意思是导航属性的导航属性.我也尝试将.Include方法与字符串路径一起使用:结果相同.
我的表结构如下所示:


这显然使用MySQL 5.1(显然是InnoDB表)作为MySQL Connector/NET 6.3.4的数据库存储.
所以我的问题是:为什么这不起作用?
注意:如果我明确加载此链接中的相关实体,我可以使其工作.但我想知道为什么EF讨厌我的数据模型.
答案:MySQL Connector显然无法处理第二个嵌套实体包含.它抛出NotSupportedException,而不是.NET EF.当我使用EF4.0尝试这个时,同样的错误也存在,但我当时的研究让我相信它是导致问题的自我跟踪实体.我尝试升级到最新的Connector,但它开始导致Out of Sync错误.这是我讨厌MySQL的另一个原因.
我的理解是F#记录是非密封类.如果是这样,我可以继承记录类型吗?例如:
type person = {name:string; address:string}
type employee inherit person = {employeeId: string}
Run Code Online (Sandbox Code Playgroud)
我搜索了MSDN文档和语言规范,我没有运气.提前致谢
我正在使用代理(MailboxProcessor)来进行需要响应的状态处理.
MailboxProcessor.PostAndAsyncReplyAsyncReplyChannel.Reply但是,我发现通过探索f#源代码,代理在响应传递之前不会处理下一条消息.总的来说这是件好事.但在我的情况下,代理更希望继续处理消息而不是等待响应传递.
做这样的事情以提供响应是否有问题?(或者有更好的选择吗?)
async { replyChannel.Reply response } |> Async.Start
Run Code Online (Sandbox Code Playgroud)
我意识到这种方法并不能保证响应按顺序传递.我没关系.
参考例子
// agent code
let doWork data =
async { ... ; return response }
let rec loop ( inbox : MailboxProcessor<_> ) =
async {
let! msg = inbox.Receive()
match msg with
| None ->
return ()
| Some ( data, replyChannel ) ->
let! response = doWork data
replyChannel.Reply response (* waits for delivery, vs below *)
// async { replyChannel.Reply response } …Run Code Online (Sandbox Code Playgroud) 我试图理解这种平等行为。记录相等性测试失败,但记录唯一属性的相等性测试通过。这是一个错误吗?或者有人可以解释这种行为吗?
type TestUnion =
| Case1
| Case2 of (int -> string)
type TestType =
{
Foo : TestUnion
}
open Microsoft.VisualStudio.TestTools.UnitTesting
[<TestClass>]
public Testing() =
let a = { Foo = Case1 }
let b = { Foo = Case1 }
[<TestMethod>]
member __.ThisFails () =
Assert.AreEqual(a, b)
[<TestMethod>]
member __.ThisPasses () =
Assert.AreEqual(a.Foo, b.Foo)
Run Code Online (Sandbox Code Playgroud)
我知道它失败的原因是因为其中一个案例是一个函数。如果我将其更改为简单值,则两个测试都会通过。但对我来说奇怪的是,a)相等性根本失败,因为使用了没有值的简单情况,b)记录相等性失败,而属性相等性通过。
注意:当还存在其他简单属性时,记录相等将失败。IOW,联合类型毒害了整个记录的相等性,即使联合类型属性测试为相等。
如何让Dapper将数据转换为带有option属性的F#类型?简单的例子:
type SomeType = {
Count : int option
}
connection.QueryAsync<SomeType>(...)
Run Code Online (Sandbox Code Playgroud)
抛出:
System.InvalidOperationException
A parameterless default constructor or one matching signature
(System.Int32 count) is required for SomeType materialization
Run Code Online (Sandbox Code Playgroud)
使用Nullable而不是选项工作:
type SomeType = {
Count : Nullable<int>
}
Run Code Online (Sandbox Code Playgroud)
但由于各种原因,它并不理想.首先,我有我使用的情况string option(因为F#通常不允许空分配,这很好),并且Nullable<string>不编译.有没有办法配置/指示Dapper自动处理option类型?我想避免每次都使用自定义映射.
如果重要,请使用Npgsql.
我试图以声明方式将TextBox控件的Text属性设置为变量的值.我发现将设置text属性的唯一方法是将其放在代码隐藏页面中,这是我想要避免的.
我试图做以下所有事情,但没有成功:
<asp:TextBox ID="myTxt" runat="server" Text='<%# MyNamespace.MyClass.StaticString %>' />
<asp:TextBox ID="myTxt" runat="server" Text='<%= MyNamespace.MyClass.StaticString %>' />
<asp:TextBox ID="myTxt" runat="server" Text='<% Response.Write(MyNamespace.MyClass.StaticString); %>' />
<asp:TextBox ID="myTxt" runat="server" /><% myTxt.Text = MyNamespace.MyClass.StaticString; %>
Run Code Online (Sandbox Code Playgroud)
这是否可能,如果是这样,怎么样?