小编Kas*_*man的帖子

Json.NET需要反序列化的所有属性

在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)

json json.net

16
推荐指数
1
解决办法
5161
查看次数

如何将 MySQL 函数结果转换为 tinyint(1)

这就是问题所在。在 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 错误,仅在特定情况下才会显示。

mysql asp.net boolean tinyint

6
推荐指数
0
解决办法
7081
查看次数

EF4.1多个嵌套实体包含获取NotSupportedException?

编辑:根据测试更新了问题描述 - 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方法与字符串路径一起使用:结果相同.

我的表结构如下所示:

Db模型

Db模型2

这显然使用MySQL 5.1(显然是InnoDB表)作为MySQL Connector/NET 6.3.4的数据库存储.

所以我的问题是:为什么这不起作用?

注意:如果我明确加载此链接中的相关实体,我可以使其工作.但我想知道为什么EF讨厌我的数据模型.

答案:MySQL Connector显然无法处理第二个嵌套实体包含.它抛出NotSupportedException,而不是.NET EF.当我使用EF4.0尝试这个时,同样的错误也存在,但我当时的研究让我相信它是导致问题的自我跟踪实体.我尝试升级到最新的Connector,但它开始导致Out of Sync错误.这是我讨厌MySQL的另一个原因.

c# mysql-connector entity-framework-4 notsupportedexception

6
推荐指数
1
解决办法
1777
查看次数

继承F#记录

我的理解是F#记录是非密封类.如果是这样,我可以继承记录类型吗?例如:

type person = {name:string; address:string}
type employee inherit person = {employeeId: string}
Run Code Online (Sandbox Code Playgroud)

我搜索了MSDN文档和语言规范,我没有运气.提前致谢

f#

6
推荐指数
2
解决办法
3676
查看次数

f#mailboxprocessor - 无需等待传递即可回复

我正在使用代理(MailboxProcessor)来进行需要响应的状态处理.

  • 呼叫者使用发布消息 MailboxProcessor.PostAndAsyncReply
  • 在代理内部,给出响应 AsyncReplyChannel.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)

f# agent mailboxprocessor

5
推荐指数
1
解决办法
737
查看次数

F# 联合类型与函数大小写的相等行为

我试图理解这种平等行为。记录相等性测试失败,但记录唯一属性的相等性测试通过。这是一个错误吗?或者有人可以解释这种行为吗?

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,联合类型毒害了整个记录的相等性,即使联合类型属性测试为相等。

f# equality discriminated-union

5
推荐指数
1
解决办法
1032
查看次数

Dapper列到F#选项属性

如何让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.

f# optional dapper

3
推荐指数
1
解决办法
985
查看次数

可以声明性地设置TextBox文本吗?

我试图以声明方式将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)

这是否可能,如果是这样,怎么样?

c# asp.net webforms

2
推荐指数
1
解决办法
1006
查看次数