繁体   English   中英

ServiceStack.OrmLite复杂类型来自SQL Server中的字符串字段

[英]ServiceStack.OrmLite complex types from string field in SQL Server

我们正在考虑使用连接到MSSQL 2008R2的ServiceStack.OrmLite.SqlServer 4.0.31来替换我们当前的ORM,并且很难设置复杂类型的字符串序列化。 在我们的旧ORM中,这些是使用自动映射器使用JSON.NET手动映射到字符串字段,因此我们已经在数据库中使用VARCHAR(MAX)列中的JSON。

我已将字符串序列化器设置为:

SqlServerDialect.Provider.StringSerializer = new JsonDataContractSerializer();

数据库类型是:

public class Group
{
    [Alias("GroupID")]
    [AutoIncrement]
    [PrimaryKey]
    public int GroupId { get; set; }

    [Alias("Name")]
    public string Name { get; set; }

    [Alias("ShortName")]
    public string ShortName { get; set; }

    [Alias("GroupTypeID")]
    public int GroupTypeId { get; set; }

    [Alias("ContactDetails")]
    public ContactDetails ContactDetails { get; set; }

}

联系方式是:

[DataContract]
[Serializable]
public class ContactDetails
{

    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }

    [DataMember]
    public string CompanyName { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Address { get; set; }
}

创建了该对象,但没有一个字段被序列化:

在此输入图像描述

数据库中的数据如下:

{
    "Address" : "2 Doe Street, Dublin 2",
    "Phone" : "01 4684455",
    "PhoneIsVerified" : false,
    "MobileIsVerified" : false,
    "Fax" : "01 4684455",
    "Email" : "john@doe.ie",
    "Website" : "http://www.doe.ie",
    "PropertySectionEmail" : {},
    "IsPrivate" : false
}

数据库中的数据如下所示:

在此输入图像描述

我在github中看到用于存储这些字段的默认字段是VARBINARY(MAX)所以我不确定这是不是为什么它不起作用但我检查了数据注释中的所有属性而没有一个我可以看到指定它是一个复杂的类型。 任何想法为什么这不起作用?

我最终在我的代码中发现了这个问题。 我用的是:

SqlServerDialect.Provider.StringSerializer = new JsonDataContractSerializer();
OrmLiteConfig.DialectProvider = SqlServerDialect.Provider;
OrmLiteConnectionFactory(connectionString, new SqlServerOrmLiteDialectProvider());

我应该在哪里使用:

SqlServerDialect.Provider.StringSerializer = new JsonDataContractSerializer();
OrmLiteConfig.DialectProvider = SqlServerDialect.Provider;
OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider);

所以我创建了一个空白方言提供程序,它没有连接序列化程序。

我不确定你错了什么,但我刚尝试了你的例子,它按预期工作:

SqlServerDialect.Provider.StringSerializer = new JsonDataContractSerializer();

var db = OpenDbConnection();
db.DropAndCreateTable<Group>();

将生成以下架构:

DROP TABLE "Group"
CREATE TABLE "Group" 
(
  "GroupID" INTEGER PRIMARY KEY IDENTITY(1,1), 
  "Name" VARCHAR(8000) NULL, 
  "ShortName" VARCHAR(8000) NULL, 
  "GroupTypeID" INTEGER NOT NULL, 
  "ContactDetails" VARCHAR(MAX) NULL 
); 

我们现在能够毫无问题地插入和选择:

var group = new Group
{
    Name = "Group Name",
    ShortName = "GN",
    GroupTypeId = 1,
    ContactDetails = new ContactDetails {
        Address = "Address",
        CompanyName = "Company",
        FirstName = "First",
        LastName = "Last",
        Title = "Title",
    }
};

db.Save(group);

var result = db.SingleById<Group>(group.GroupId);

result.PrintDump();

这会按预期打印出已填充的行:

{
    GroupId: 1,
    Name: Group Name,
    ShortName: GN,
    GroupTypeId: 1,
    ContactDetails: 
    {
        FirstName: First,
        LastName: Last,
        CompanyName: Company,
        Title: Title,
        Address: Address
    }
}

在SQL Server内部,它按预期存储JSON:

SQL Server中的JSON

此示例也可作为独立测试使用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM