11

How can I create a column in a table and specify it as varchar(max) when using servicestack ormlite?

Currently I execute some sql after the table create to get what I want. I've seen the StringLength attribute but was wondering if there's a nicer way of doing it?

Something like

StringLength(Sql.VarcharMax)

Thanks

4

4 回答 4

3

通过执行以下操作解决了该问题

 if (!db.TableExists(typeof(Entity).Name))
 {
   db.CreateTableIfNotExists<Entity>();
   db.ExecuteSql("ALTER TABLE Entity ALTER COLUMN Column VARCHAR(MAX)");
 }
于 2013-06-28T18:34:26.813 回答
2

装饰你的领域模型System.ComponentModel.DataAnnotations.StringLengthAttribute

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

或者

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

使用任何大于 8000 的长度来超过需要声明的 Sql Server varchar/nvarchar列类型的最大长度。MAX

使用理解MAX声明的自定义方言提供程序。

public class MaxSqlProvider : SqlServerOrmLiteDialectProvider
{
  public new static readonly MaxSqlProvider Instance = new MaxSqlProvider ();

  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);
       var max = string.Format(StringLengthColumnDefinitionFormat, "MAX");

       fieldDefinition = fieldDefinition.Replace(orig, max);
     }

     return fieldDefinition;
  }
}

构建数据库工厂时使用提供者

var dbFactory = new OrmLiteConnectionFactory(conStr, MaxSqlProvider.Instance);

请注意,此插图专门针对 SqlServer,但它与其他数据提供程序相关,在从所需提供程序继承后进行了细微更改。

于 2014-09-08T17:12:17.800 回答
1

似乎 ServiceStack 已通过进一步自定义字段创建类型的功能解决了这个问题,请参阅:https ://github.com/ServiceStack/ServiceStack.OrmLite#custom-field-declarations

或在该链接中详细说明:

[CustomField] 属性可用于在生成的 Create table DDL 语句中指定自定义字段声明,例如:

public class PocoTable
{
    public int Id { get; set; }

    [CustomField("CHAR(20)")]
    public string CharColumn { get; set; }

    [CustomField("DECIMAL(18,4)")]
    public decimal? DecimalColumn { get; set; }
}

在哪里

db.CreateTable<PocoTable>(); 

生成并执行以下 SQL:

CREATE TABLE "PocoTable" 
(
  "Id" INTEGER PRIMARY KEY, 
  "CharColumn" CHAR(20) NULL, 
  "DecimalColumn" DECIMAL(18,4) NULL 
);  

但是,根据我对先前答案之一的评论,我这可能是特定于数据库的,抱歉,我无法轻松访问多个数据库服务器进行测试。

于 2016-11-28T19:32:36.037 回答
1

可以使用OrmLite 的类型转换器控制每种类型的列定义,其中默认的SqlServerStringConvertersVARCHAR(MAX)用于属性为 的属性[StringLength(StringLengthAttribute.MaxText)],例如:

public class PocoTable
{
    public int Id { get; set; }

    [StringLength(StringLengthAttribute.MaxText)]
    public string MaxText { get; set; }

    [StringLength(256)]
    public string SmallText { get; set; }
}

使用StringLengthAttribute.MaxText(或其别名int.MaxValue)将自动使用最合适的数据类型在每个 RDBMS 中存储大字符串。

于 2016-11-28T19:42:06.583 回答