簡體   English   中英

ServiceStack.OrmLite中的ntext

[英]ntext in ServiceStack.OrmLite

我怎樣才能在ServiceStack.OrmLite代碼中首先使用nText數據類型?

public class Email
{
    [AutoIncrement]
    public long ID { get; set; }


    public DateTime Date { get; set; }

    public string From { get; set; }

    public string Subject { get; set; } 

    nText =>
    public string Body { get; set; } 

}

如果我使用字符串數據類型,ormlite在數據庫中生成nVarchar(8000)

我需要超過8000個字符的數據

您需要從ServiceStack.OrmLite的stringBody類型轉換為byte[]以使用varchar(max)列類型。 像下面這樣的東西:

public byte[] Body { get; set; }

其原因在於ServiceStack.OrmLite代碼。

ServiceStack.OrmLite / OrmLiteDialectProviderBase.cs文件中, InitColumnTypeMap()方法是:

DbTypeMap.Set<byte[]>(DbType.Binary, BlobColumnDefinition);

ServiceStack.OrmLite.SqlServer / SqlServerOrmLiteDialectProvider.cs文件中, SqlServerOrmLiteDialectProvider()方法是:

base.BlobColumnDefinition = "VARBINARY(MAX)";

從此代碼中,您可以看到內部映射從C#類型發生到內部ServiceStack.OrmLite類型,然后返回到SqlServer類型。

這個問題解釋了如何在字符串和字節數組之間來回轉換, 如何在不手動指定編碼的情況下在C#中獲得字符串的一致字節表示?

假設你真的想要NTEXT 如果你想要nvarchar(max)varchar(max)請參閱https://stackoverflow.com/a/25729568/37055

使用System.ComponentModel.DataAnnotations.StringLengthAttribute裝飾您的域模型

[StringLengthAttribute(8001)]
public string Markdown { get;set; }

要么

[StringLength(Int32.MaxValue)]
public string Markdown { get;set; }

使用任何大於8000的長度超過Sql Server varchar / nvarchar列類型的最大長度。

使用自定義方言提供程序了解NTEXT聲明。

public class NTextSqlProvider : SqlServerOrmLiteDialectProvider
{
  public new static readonly NTextSqlProvider Instance = new NTextSqlProvider();

  public override string GetColumnDefinition(string fieldName, Type fieldType, 
            bool isPrimaryKey, bool autoIncrement, bool isNullable, 
            int? fieldLength, int? scale, string defaultValue)
  {
     var fieldDefinition = base.GetColumnDefinition(fieldName, fieldType,
                                    isPrimaryKey, autoIncrement, isNullable, 
                                    fieldLength, scale, defaultValue);

     if (fieldType == typeof (string) && fieldLength > 8000)
     {
       var orig = string.Format(StringLengthColumnDefinitionFormat, fieldLength);

       fieldDefinition = fieldDefinition.Replace(orig, "NTEXT");
     }

     return fieldDefinition;
  }
}

在構造數據庫工廠時使用提供程序

var dbFactory = new OrmLiteConnectionFactory(conStr, NTextSqlProvider.Instance);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM