【问题标题】:ServiceStack.OrmLite complex types from string field in SQL ServerSQL Server 中字符串字段的 ServiceStack.OrmLite 复杂类型
【发布时间】:2014-10-13 21:36:08
【问题描述】:

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

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

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),所以我不确定这是否是它不起作用的原因,但我检查了数据注释中的所有属性,但没有一个我可以看到指定它是复杂类型。任何想法为什么这不起作用?

【问题讨论】:

  • 任何 POCO 都自动成为复杂类型。目前尚不清楚究竟是什么不起作用,数据库中的 JSON 是什么样的,您使用的是什么 OrmLite API 以及实际结果是什么?
  • 我在问题中添加了更多细节,希望能澄清问题。看起来,seralizer 创建了联系人详细信息 poco,因为它不为 null,但未填充它,但 json 可用于填充对象。

标签: c# servicestack ormlite-servicestack


【解决方案1】:

我最后在我的代码中发现了问题。我正在使用:

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

所以我创建了一个没有附加序列化程序的空白方言提供程序。

【讨论】:

    【解决方案2】:

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

    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:

    这个例子也是available as a stand-alone test

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多