2013-06-20 63 views
10

如何使用servicestack ormlite在表中创建列并将其指定为varchar(max)?使用varchar(max)创建列而不是varchar(8000)

目前我执行表创建后得到我想要的一些SQL。 我见过StringLength属性,但想知道是否有更好的方法来做到这一点?

喜欢的东西

StringLength(Sql.VarcharMax) 

感谢

+0

在这里,你有更多的细节[NTEXT功能于servicestack-ormlite] [1] [1]:http://stackoverflow.com/questions/11281726/ntext-in-servicestack-ormlite –

+0

我会对使用StringColumnDefinition = UseUnicode的原因感兴趣吗? “NVARCHAR(4000)”:“VARCHAR(8000)”; – mosesfetters

+0

@FettMo如果你的意思是为什么4000和8000 - SQL Server Express中的varchar字段最大为8000(除非你使用max)。 nvarchar是varchar的两倍,所以它的最大值为4000. – kape123

回答

3

通过执行以下操作

if (!db.TableExists(typeof(Entity).Name)) 
{ 
    db.CreateTableIfNotExists<Entity>(); 
    db.ExecuteSql("ALTER TABLE Entity ALTER COLUMN Column VARCHAR(MAX)"); 
} 
+0

中设置了限制我喜欢这个答案,但它可能值得指出这是MS SQL特有的,不是吗? –

2

装饰你的域模型与解决此问题曾任职System.ComponentModel.DataAnnotations.StringLengthAttribute

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

,或者使用大于8000的任何长度超过该所需的MAX声明SQL服务器varchar/nvarchar列类型的最大长度

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

使用自定义方言提供程序了解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的,但它会为相关与所需的供应商继承后轻微改动其他数据提供者。

1

似乎ServiceStack已经与特征,以进一步定制字段的创建类型解决了这个,请参见:https://github.com/ServiceStack/ServiceStack.OrmLite#custom-field-declarations

或在该链路作为详细:

的〔的CustomField]属性可以是用于在生成创建表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 
); 

再次然而,按照我的意见Ø以前的答案之一,我猜测这可能是DB-具体,对不起,我无法轻松访问多个数据库服务器进行测试。

+0

仅供参考[请参阅我的回答](http://stackoverflow.com/a/40852209/85785),您也可以在其中使用[自定义类型转换器](https://github.com/ServiceStack/ServiceStack.OrmLite/ wiki/OrmLite-Type-Converters)修改每个RDBMS每个数据类型的列定义。 – mythz

1

每种类型的可使用OrmLite's Type Converters来控制其中默认SqlServerStringConverters将使用VARCHAR(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中存储大型字符串的适当数据类型。