ServiceStack.OrmLite中的ntext

时间:2012-07-01 11:52:08

标签: c# sql-server code-first servicestack ormlite-servicestack

如何在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个字符的数据

2 个答案:

答案 0 :(得分:4)

您需要将Body类型从byte[]转换为string,以便ServiceStack.OrmLite使用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类型。

这个问题解释了如何在字符串和字节数组之间来回转换How do I get a consistent byte representation of strings in C# without manually specifying an encoding?

答案 1 :(得分:2)

假设你 真的 想要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);