在使用servicestack ormlite时,如何在表中创建列并将其指定为varchar(max)?
目前,我在表创建之后执行一些sql来获得我想要的东西。我看过StringLength属性,但想知道有没有更好的方法?
就像这样
StringLength(Sql.VarcharMax)谢谢
发布于 2013-06-29 02:34:27
通过执行以下操作解决了此问题
if (!db.TableExists(typeof(Entity).Name))
{
db.CreateTableIfNotExists<Entity>();
db.ExecuteSql("ALTER TABLE Entity ALTER COLUMN Column VARCHAR(MAX)");
}发布于 2014-09-09 01:12:18
用System.ComponentModel.DataAnnotations.StringLengthAttribute修饰你的域模型
比如
[StringLengthAttribute(8001)]
public string Markdown { get;set; }或
[StringLength(Int32.MaxValue)]
public string Markdown { get;set; }使用任何大于8000的长度超过需要MAX声明的Sql Server varchar/nvarchar列类型的最大长度。
使用能够理解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,但它与继承自所需提供程序后稍有更改的其他数据提供程序相关。
发布于 2016-11-29 03:32:36
ServiceStack似乎已经通过进一步自定义字段创建类型的功能解决了此问题,请参阅:https://github.com/ServiceStack/ServiceStack.OrmLite#custom-field-declarations
或在该链接中详细说明:
CustomField属性可用于在生成的Create table语句中指定自定义字段声明,例如:
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的,对不起,我无法轻松访问多个db服务器进行测试。
https://stackoverflow.com/questions/17212917
复制相似问题