怎样才能先在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个字符的数据
发布于 2013-06-12 02:51:54
您需要将Body类型从string转换为byte[],以便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?。
发布于 2014-09-09 01:19:21
假设你真的想要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);https://stackoverflow.com/questions/11281726
复制相似问题