8

¿cómo puedo tener nText datatype en ServiceStack.OrmLite Code primero?ntext en 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; } 

} 

si yo uso el tipo de datos de cadena, ormlite generar nvarchar (8000) en la base de datos

necesito más de 8000 caracteres para los datos

+0

C# 's cadena de tipo de datos está muy bien para ntext. Puede contener caracteres Unicode y puede contener una cadena de longitud arbitraria. – Andomar

+6

No utilice 'text',' ntext' o 'image' para un nuevo desarrollo; estos tipos de datos están [en desuso] (http://msdn.microsoft.com/en-us/library/ms187993.aspx). Utilice, respectivamente, 'varchar (MAX)', 'nvarchar (MAX)', y 'varbinary (MAX)'. Deberá consultar su documentación ORM para saber cómo usar esos tipos. –

+0

Apoyo el comentario de @JonSeigel. Y puedes dar la longitud de la cuerda usando atributos en Ormlite. – kunjee

Respuesta

4

Es necesario para convertir su tipo Body a byte[] de string para ServiceStack .OrmLite para usar el tipo de columna varchar(max). Algo como el siguiente:

public byte[] Body { get; set; } 

El motivo de esto se encuentra dentro del código ServiceStack.OrmLite.

En el archivo ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs, bajo el método de InitColumnTypeMap() es:

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

En el archivo ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs, bajo el método de SqlServerOrmLiteDialectProvider() es:

base.BlobColumnDefinition = "VARBINARY(MAX)"; 

A partir de este código, se puede ver que un interno la asignación se realiza desde el tipo C# al tipo interno ServiceStack.OrmLite y luego vuelve al tipo SqlServer.

Esta pregunta explica cómo convertir entre series y matrices de bytes, How do I get a consistent byte representation of strings in C# without manually specifying an encoding?.

2

Suponiendo que realmente desee NTEXT. Si quieres nvarchar(max) o varchar(max) ver https://stackoverflow.com/a/25729568/37055

Decora tu modelo de dominio con System.ComponentModel.DataAnnotations.StringLengthAttribute

como

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

o

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

utilizando cualquier longitud superior a 8000 exceda la longitud máxima del servidor Sql varchar/nvarchar column tipos.

Use un proveedor de dialectos personalizado que comprenda la declaración 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; 
    } 
} 

utilizar el proveedor cuando se construye la fábrica de la base de datos

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