首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServiceStack.OrmLite中的ntext

ServiceStack.OrmLite中的ntext
EN

Stack Overflow用户
提问于 2012-07-01 19:52:08
回答 2查看 2K关注 0票数 8

怎样才能先在ServiceStack.OrmLite代码中使用nText数据类型?

代码语言:javascript
复制
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个字符的数据

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-12 02:51:54

您需要将Body类型从string转换为byte[],以便ServiceStack.OrmLite使用varchar(max)列类型。如下所示:

代码语言:javascript
复制
public byte[] Body { get; set; }

出现这种情况的原因在于ServiceStack.OrmLite代码。

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

代码语言:javascript
复制
DbTypeMap.Set<byte[]>(DbType.Binary, BlobColumnDefinition);

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

代码语言:javascript
复制
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?

票数 4
EN

Stack Overflow用户

发布于 2014-09-09 01:19:21

假设你真的想要NTEXT。如果需要nvarchar(max)varchar(max),请参阅https://stackoverflow.com/a/25729568/37055

System.ComponentModel.DataAnnotations.StringLengthAttribute修饰你的域模型

比如

代码语言:javascript
复制
[StringLengthAttribute(8001)]
public string Markdown { get;set; }

代码语言:javascript
复制
[StringLength(Int32.MaxValue)]
public string Markdown { get;set; }

使用大于8000的任意长度超过Sql Server varchar/nvarchar列类型的最大长度。

使用能够理解NTEXT声明的自定义方言提供程序。

代码语言:javascript
复制
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;
  }
}

在构造数据库工厂时使用提供程序

代码语言:javascript
复制
var dbFactory = new OrmLiteConnectionFactory(conStr, NTextSqlProvider.Instance);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11281726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档