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

时间:2014-10-01 16:14:39

标签: c# servicestack ormlite-servicestack

我们正在考虑使用连接到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; }
}

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

enter image description here

数据库中的数据如下:

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

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

enter image description here

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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:

JSON in SQL Server

此示例也是available as a stand-alone test