2013-10-12 7 views
1

Я использую OrmLite для MySql (из nuget) и имею некоторые объекты, которые я сохраняю, что приведет к сериализации и размытию содержимого. Я нахожу, что схема для этих полей по умолчанию используется varchar (255), которая работает только для небольших капель. Даже относительно небольшие списки слишком велики для 255 символов.ServiceStack ORMLite blobbed столбцы в MySQL

Каков наилучший подход к обеспечению правильного размера таблиц blob при использовании OrmLite?

Пример:

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

Подразумеваемый тип данных var varar, вопрос должен был касаться наилучшего подхода к установке верхнего предела размера, по умолчанию используется varchar (255) для blobbed типов без аннотаций. Кажется, что ручная калибровка - это путь, но хотелось бы увидеть, есть ли лучшие или альтернативные варианты. – Steve

+0

Добавлен пример тестового примера выше, чтобы проиллюстрировать – Steve

Смежные вопросы