8

Wie kann ich nText-Datentyp in ServiceStack.Ormlite Code zuerst haben?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; } 

} 

wenn i String-Datentyp verwenden, ormlite erzeugen nvarchar (8000) in der Datenbank

ich brauche mehr als 8000 Zeichen für die Daten

+0

C# 's String-Datentyp für ntext- in Ordnung ist. Es kann Unicode-Zeichen enthalten und eine Zeichenfolge beliebiger Länge enthalten. – Andomar

+6

Verwenden Sie 'text',' ntext' oder 'image' nicht für Neuentwicklungen - diese Datentypen sind [veraltet] (http://msdn.microsoft.com/en-us/library/ms187993.aspx). Verwenden Sie jeweils 'varchar (MAX)', 'nvarchar (MAX)' und 'varbinary (MAX)'. Sie müssen in Ihrer ORM-Dokumentation nachlesen, wie Sie diese Typen verwenden können. –

+0

Ich unterstütze @JonSeigels Kommentar. Und Sie können die Länge der Zeichenfolge mit Attributen in Ormlite angeben. – kunjee

Antwort

4

Sie benötigen Body Typ byte[] von string für ServiceStack konvertieren .Ormlite, um den Spaltentyp varchar(max) zu verwenden. So etwas wie das Folgende:

public byte[] Body { get; set; } 

Der Grund dafür liegt innerhalb des ServiceStack.Ormlite-Codes.

In der Datei ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs unter der Methode InitColumnTypeMap() ist:

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

In der Datei ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs unter der Methode SqlServerOrmLiteDialectProvider() ist:

base.BlobColumnDefinition = "VARBINARY(MAX)"; 

Von diesem Code Sie, dass eine interne sehen Die Zuordnung erfolgt vom C# -Typ zum internen ServiceStack.OrmLite-Typ und dann zurück zum SqlServer-Typ.

Diese Frage erläutert, wie Sie zwischen Strings und Byte-Arrays, How do I get a consistent byte representation of strings in C# without manually specifying an encoding?, hin und her konvertieren.

2

Angenommen, Sie wirklichNTEXT wollen. Wenn Sie möchten, nvarchar(max) oder varchar(max) sehen https://stackoverflow.com/a/25729568/37055

Schmücken Sie Ihren Domain-Modell mit System.ComponentModel.DataAnnotations.StringLengthAttribute

wie

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

oder

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

jede Länge von mehr als 8000 mit der maximalen Länge überschreiten von Sql Server varchar/nvarchar Spalte Arten.

Verwenden Sie einen benutzerdefinierten Dialekt-Anbieter, der die NTEXT Deklaration versteht.

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; 
    } 
} 

den Anbieter verwenden, wenn Sie die Datenbank Fabrik

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