簡體   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