8

Как я могу использовать тип данных nText в ServiceStack.OrmLite Code?ntext в ServiceStack.OrmLite

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 символов для данных

+0

C# 's строка типа данных отлично подходит для NTEXT. Он может содержать символы Unicode и может содержать произвольную длину. – Andomar

+6

Не используйте 'text',' ntext' или 'image' для новой разработки - эти типы данных [устарели] (http://msdn.microsoft.com/en-us/library/ms187993.aspx). Используйте, соответственно, 'varchar (MAX)', 'nvarchar (MAX)' и 'varbinary (MAX)'. Вам нужно проконсультироваться с вашей документацией ORM о том, как использовать эти типы. –

+0

Я поддерживаю комментарий @JonSeigel. И вы можете указать длину строки, используя атрибуты в Ormlite. – kunjee

ответ

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?.

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 varchar/nvarchar column типы.

Использование специального поставщика диалектов понимает декларацию 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); 
Смежные вопросы