8

Come posso avere il tipo di dati nText nel codice ServiceStack.OrmLite prima?ntext in 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; } 

} 

se io uso stringa tipo di dati, ormlite generare nvarchar (8000) nel database

ho bisogno di più di 8000 caratteri per i dati

+0

C# 's stringa tipo di dati è bene per ntext. Può contenere caratteri unicode e può contenere una stringa di lunghezza arbitraria. – Andomar

+6

Non utilizzare 'text',' ntext' o 'image' per il nuovo sviluppo - questi tipi di dati sono [deprecati] (http://msdn.microsoft.com/en-us/library/ms187993.aspx). Usa, rispettivamente, 'varchar (MAX)', 'nvarchar (MAX)' e 'varbinary (MAX)'. Avrai bisogno di consultare la tua documentazione ORM su come usare questi tipi. –

+0

Sostengo il commento di @JonSeigel. E puoi dare una lunghezza di stringa usando gli attributi in Ormlite. – kunjee

risposta

4

È necessario convertire il tipo di Body a byte[] da string per ServiceStack .OrmLite per utilizzare il tipo di colonna varchar(max). Qualcosa di simile al seguente:

public byte[] Body { get; set; } 

La ragione di ciò si trova all'interno del codice ServiceStack.OrmLite.

Nel file ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs, con il metodo del InitColumnTypeMap() è:

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

Nel file ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs, con il metodo del SqlServerOrmLiteDialectProvider() è:

base.BlobColumnDefinition = "VARBINARY(MAX)"; 

Da questo codice, si può vedere che un interno la mappatura avviene dal tipo C# al tipo interno di ServiceStack.OrmLite e quindi si esegue il backup sul tipo SqlServer.

Questa domanda spiega come convertire avanti e indietro tra stringhe e array di byte, How do I get a consistent byte representation of strings in C# without manually specifying an encoding?.

2

si Supponendo davvero vuole NTEXT. Se si desidera nvarchar(max) o varchar(max) vedere https://stackoverflow.com/a/25729568/37055

decorare il vostro modello di dominio con System.ComponentModel.DataAnnotations.StringLengthAttribute

come

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

o

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

utilizzando qualsiasi lunghezza superiore a 8000 di superare la lunghezza massima di Sql Server varchar/nvarchar colonna tipi.

Utilizzare un provider di chiamate personalizzate che comprende la dichiarazione 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; 
    } 
} 

utilizzare il provider quando si costruisce la fabbrica di database

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