2013-10-12 100 views
1

我正在使用OrmLite for MySql(來自nuget),並且有一些對象會持續導致內容被序列化和blobbed。我發現這些字段的模式默認爲varchar(255),僅適用於小塊。即使相對較小的列表對於255個字符也太大。ServiceStack MySQL中的ORMLite blobbed列

使用OrmLite時,確保blob表大小正確的最佳方法是什麼?

例子:

public class Foo : IHasId<long> 
{ 
    [AutoIncrement] 
    public long Id { get; set; } 

    public Dictionary<string, string> TestSize { get; set; } 
} 

我以現在是[StringLength(6000)]註釋每個blobbed領域的做法。雖然這有效,但我不確定是否有更好的方法來確保足夠的空間。

下面是一個完整的單元測試,說明了上漿問題:

using NUnit.Framework; 
using ServiceStack.DataAnnotations; 
using ServiceStack.DesignPatterns.Model; 
using ServiceStack.OrmLite; 
using ServiceStack.OrmLite.MySql; 
using System; 
using System.Collections.Generic; 
using System.Configuration; 

namespace OrmLiteTestNamespace 
{ 
    [TestFixture] 
    public class BlobItemTest 
    { 
     [Test] 
     public void TableFieldSizeTest() 
     { 
      var dbFactory = new OrmLiteConnectionFactory(
        ConfigurationManager.AppSettings["mysqlTestConn"], 
        MySqlDialectProvider.Instance); 
      using (var db = dbFactory.OpenDbConnection()) 
      { 
       db.CreateTableIfNotExists<Foo>(); 
       var foo1 = new Foo() 
        { 
         TestSize = new Dictionary<string, string>() 
        }; 

       // fill the dictionary with 300 things 
       for (var i = 0; i < 300; i++) 
       { 
        foo1.TestSize.Add(i.ToString(), Guid.NewGuid().ToString()); 
       } 
       // throws MySql exception "Data too long for column 'TestSize' at row 1" 
       db.Insert(foo1); 

      } 
     } 

    } 
    public class Foo : IHasId<long> 
    { 
     [AutoIncrement] 
     public long Id { get; set; } 

     public Dictionary<string, string> TestSize { get; set; } 
    } 
} 

回答

0

Varchar數據類型是一個可變大小數據類型,其空間僅由字段的內容,而不是的大小來確定列定義。例如。在MySQL中,它只佔用size of the contents + 2 bytes for the length(最長65535)。

+0

瞭解重新varchar數據類型,問題的目的是爲了設置大小上限的最佳方法,它缺省爲varchar(255)爲沒有註釋的blobbed類型。手動上漿似乎是要走的路,但想看看是否有更好的或替代的選擇。 – Steve

+0

添加上面的單元測試示例來說明 – Steve