如何在表中创建列并在使用servicestack ormlite时将其指定为varchar(max)?
目前我在创建表后执行一些sql以获得我想要的内容。 我已经看过StringLength属性,但想知道是否有更好的方法呢?
像
这样的东西StringLength(Sql.VarcharMax)
由于
答案 0 :(得分:3)
通过执行以下操作解决了这个问题
if (!db.TableExists(typeof(Entity).Name))
{
db.CreateTableIfNotExists<Entity>();
db.ExecuteSql("ALTER TABLE Entity ALTER COLUMN Column VARCHAR(MAX)");
}
答案 1 :(得分:2)
使用System.ComponentModel.DataAnnotations.StringLengthAttribute
,例如
[StringLengthAttribute(8001)]
public string Markdown { get;set; }
或
[StringLength(Int32.MaxValue)]
public string Markdown { get;set; }
使用大于8000的任何长度超过需要varchar
声明的Sql Server 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,但在从所需提供程序继承之后,它与其他数据提供程序相关,但会有轻微的更改。
答案 2 :(得分: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
);
然而,根据我的评论o之前的答案之一,我猜测这可能是特定于数据库的,抱歉,我无法轻松访问多个数据库服务器去测试。
答案 3 :(得分: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中存储大字符串。