如何使用servicestack ormlite在表中创建列并将其指定为varchar(max)?使用varchar(max)创建列而不是varchar(8000)
目前我执行表创建后得到我想要的一些SQL。 我见过StringLength属性,但想知道是否有更好的方法来做到这一点?
喜欢的东西
StringLength(Sql.VarcharMax)
感谢
如何使用servicestack ormlite在表中创建列并将其指定为varchar(max)?使用varchar(max)创建列而不是varchar(8000)
目前我执行表创建后得到我想要的一些SQL。 我见过StringLength属性,但想知道是否有更好的方法来做到这一点?
喜欢的东西
StringLength(Sql.VarcharMax)
感谢
通过执行以下操作
if (!db.TableExists(typeof(Entity).Name))
{
db.CreateTableIfNotExists<Entity>();
db.ExecuteSql("ALTER TABLE Entity ALTER COLUMN Column VARCHAR(MAX)");
}
中设置了限制我喜欢这个答案,但它可能值得指出这是MS SQL特有的,不是吗? –
装饰你的域模型与解决此问题曾任职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的,但它会为相关与所需的供应商继承后轻微改动其他数据提供者。
似乎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-具体,对不起,我无法轻松访问多个数据库服务器进行测试。
仅供参考[请参阅我的回答](http://stackoverflow.com/a/40852209/85785),您也可以在其中使用[自定义类型转换器](https://github.com/ServiceStack/ServiceStack.OrmLite/ wiki/OrmLite-Type-Converters)修改每个RDBMS每个数据类型的列定义。 – mythz
每种类型的可使用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中存储大型字符串的适当数据类型。
在这里,你有更多的细节[NTEXT功能于servicestack-ormlite] [1] [1]:http://stackoverflow.com/questions/11281726/ntext-in-servicestack-ormlite –
我会对使用StringColumnDefinition = UseUnicode的原因感兴趣吗? “NVARCHAR(4000)”:“VARCHAR(8000)”; – mosesfetters
@FettMo如果你的意思是为什么4000和8000 - SQL Server Express中的varchar字段最大为8000(除非你使用max)。 nvarchar是varchar的两倍,所以它的最大值为4000. – kape123