简体   繁体   English

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

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

We are looking at using ServiceStack.OrmLite.SqlServer 4.0.31 connected to MSSQL 2008R2 to replace our current ORM and are having difficulty in setting up the complex type string serialization. 我们正在考虑使用连接到MSSQL 2008R2的ServiceStack.OrmLite.SqlServer 4.0.31来替换我们当前的ORM,并且很难设置复杂类型的字符串序列化。 In our old ORM these were manually mapping using auto mapper to string fields using JSON.NET so we already have our JSON in the database in columns which are VARCHAR(MAX). 在我们的旧ORM中,这些是使用自动映射器使用JSON.NET手动映射到字符串字段,因此我们已经在数据库中使用VARCHAR(MAX)列中的JSON。

I have set the string serializer to be: 我已将字符串序列化器设置为:

SqlServerDialect.Provider.StringSerializer = new JsonDataContractSerializer();

The data base type is: 数据库类型是:

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; }

}

The contact details is: 联系方式是:

[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; }
}

The object is created but none of the fields are serialised: 创建了该对象,但没有一个字段被序列化:

在此输入图像描述

The data in the database is as follows: 数据库中的数据如下:

{
    "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
}

The data in the DB looks like: 数据库中的数据如下所示:

在此输入图像描述

I saw in github that the default field for storing for these fields was VARBINARY(MAX) so I am not sure if thats why its not working but I checked all the attributes in data annotations and there was not one I could see to specify that it was a complex type. 我在github中看到用于存储这些字段的默认字段是VARBINARY(MAX)所以我不确定这是不是为什么它不起作用但我检查了数据注释中的所有属性而没有一个我可以看到指定它是一个复杂的类型。 Any ideas why this is not working? 任何想法为什么这不起作用?

I found the issue in my code in the end. 我最终在我的代码中发现了这个问题。 I was using: 我用的是:

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

Where I should have been using: 我应该在哪里使用:

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

So I was creating a blank dialect provider which did not have the serializer attached. 所以我创建了一个空白方言提供程序,它没有连接序列化程序。

I'm not sure what you're wrong, but I've just tried your example and it works as expected: 我不确定你错了什么,但我刚尝试了你的例子,它按预期工作:

SqlServerDialect.Provider.StringSerializer = new JsonDataContractSerializer();

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

Will generate the schema below: 将生成以下架构:

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

Which we're now able to insert and select from without issue: 我们现在能够毫无问题地插入和选择:

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();

That prints out the populated row as expected: 这会按预期打印出已填充的行:

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

And inside SQL Server it's storing JSON as expected: 在SQL Server内部,它按预期存储JSON:

SQL Server中的JSON

This example is also available as a stand-alone test . 此示例也可作为独立测试使用

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

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