2012-07-01 13 views
8

मैं सर्विसस्टैक.ऑरमलाइट कोड में पहले nText डेटाटाइप कैसे रख सकता हूं?सर्विसस्टैक में ntext.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; } 

} 

अगर मैं स्ट्रिंग डेटाप्रकार उपयोग करते हैं, NVARCHAR (8000) डेटाबेस में उत्पन्न ormlite

मैं डेटा

+0

सी # की स्ट्रिंग डेटाप्रकार ntext के लिए ठीक है का निर्माण प्रदाता का उपयोग करें। इसमें यूनिकोड वर्ण हो सकते हैं, और एक मनमाना लंबाई स्ट्रिंग पकड़ सकते हैं। – Andomar

+6

नए विकास के लिए 'text',' ntext' या 'image' का उपयोग न करें - इन डेटा प्रकारों को [बहिष्कृत] (http://msdn.microsoft.com/en-us/library/ms187993.aspx) हैं। क्रमशः, 'वर्कर (MAX) ',' nvarchar (MAX)', और 'varbinary (MAX) 'का उपयोग करें। उन प्रकारों का उपयोग करने के लिए आपको अपने ओआरएम दस्तावेज से परामर्श करने की आवश्यकता होगी। –

+0

मैं @ जोन्स सिगेल की टिप्पणी का समर्थन करता हूं। और आप Ormlite में विशेषताओं का उपयोग कर स्ट्रिंग की लंबाई दे सकते हैं। – kunjee

उत्तर

4

आप ServiceStack के लिए string से byte[] करने के लिए अपने Body प्रकार बदलने की आवश्यकता के लिए 8000 से अधिक चरित्र की जरूरत है Ormite 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)"; 

इस कोड से, आप एक आंतरिक देख सकते हैं कि मैपिंग सी # प्रकार से आंतरिक सर्विसस्टैक.ऑरमलाइट प्रकार में हो रही है और फिर 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

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

या

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

System.ComponentModel.DataAnnotations.StringLengthAttribute

जैसे 8000 से अधिक किसी भी लम्बाई का उपयोग कर अधिकतम लंबाई को पार करने के लिए के साथ अपने डोमेन मॉडल डेकोरेट एसक्यूएल सर्वर 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); 
संबंधित मुद्दे