C# NHibernate SchemaExport不创建ntext列
我创建了一个简单的工具,它使用C# NHibernate SchemaExport不创建ntext列,c#,nhibernate,orm,nhibernate-mapping,schemaexport,C#,Nhibernate,Orm,Nhibernate Mapping,Schemaexport,我创建了一个简单的工具,它使用SchemaExport生成数据库和sql脚本。在简单实体上,SQL Server中的一个字符串属性Description应该是ntext列,但实际上它是nvarchar(255) 不确定哪一部分我错了,任何建议都是感激的 下面是我的代码,只需创建一个控制台应用程序+添加NHibernatenumget包即可运行 using System; using NHibernate.Cfg; using NHibernate.Dialect; using NHiberna
SchemaExport
生成数据库和sql脚本。在简单实体上,SQL Server中的一个字符串属性Description
应该是ntext
列,但实际上它是nvarchar(255)
不确定哪一部分我错了,任何建议都是感激的
下面是我的代码,只需创建一个控制台应用程序+添加NHibernate
numget包即可运行
using System;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Mapping.ByCode;
using NHibernate.Mapping.ByCode.Conformist;
using NHibernate.Tool.hbm2ddl;
namespace ConsoleApplication1
{
public class Item
{
public int Id { get; set; }
public string Description { get; set; }
}
public class ItemMap : ClassMapping<Item>
{
public ItemMap()
{
Id(e => e.Id, m => m.Generator(Generators.Identity));
Property(e => e.Description, m =>
{
m.NotNullable(true);
m.Length(int.MaxValue);
});
}
}
class Program
{
private const string ConnectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=db01;Integrated Security=True";
static void Main(string[] args)
{
var modelMapper = BuildModelMapper();
var configuration = GetConfiguration();
configuration.AddDeserializedMapping(modelMapper.CompileMappingForAllExplicitlyAddedEntities(), null);
try
{
new SchemaExport(configuration).Execute(false, true, false);
Console.WriteLine("Done");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadLine();
}
private static ModelMapper BuildModelMapper()
{
var mm = new ModelMapper();
mm.AddMapping(typeof(ItemMap));
return mm;
}
private static Configuration GetConfiguration()
{
var cfg = new Configuration();
cfg.DataBaseIntegration(db =>
{
db.Driver<SqlClientDriver>();
db.Dialect<MsSql2008Dialect>();
db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
db.ConnectionString = ConnectionString;
db.LogFormattedSql = true;
db.LogSqlInConsole = true;
db.AutoCommentSql = true;
});
return cfg;
}
}
}
使用系统;
使用NHibernate.Cfg;
使用NHibernate方言;
使用NHibernate.Driver;
使用NHibernate.Mapping.ByCode;
使用NHibernate.Mapping.ByCode.Conformist;
使用NHibernate.Tool.hbm2ddl;
命名空间控制台应用程序1
{
公共类项目
{
公共int Id{get;set;}
公共字符串说明{get;set;}
}
公共类ItemMap:类映射
{
公共项目映射()
{
Id(e=>e.Id,m=>m.Generator(Generators.Identity));
属性(e=>e.描述,m=>
{
m、 不可为空(true);
m、 长度(int.MaxValue);
});
}
}
班级计划
{
private const string ConnectionString=@“数据源=。\SQLEXPRESS;初始目录=db01;集成安全性=True”;
静态void Main(字符串[]参数)
{
var modelMapper=BuildModelMapper();
var-configuration=GetConfiguration();
AddDeserializedMapping(modelMapper.compileMappingForAllExplicitlyAddIdentities(),null);
尝试
{
新建SchemaExport(配置)。执行(false、true、false);
控制台。写入线(“完成”);
}
捕获(例外情况除外)
{
控制台写入线(ex);
}
Console.ReadLine();
}
私有静态模型映射器BuildModelMapper()
{
var mm=新的ModelMapper();
mm.AddMapping(typeof(ItemMap));
返回mm;
}
私有静态配置GetConfiguration()
{
var cfg=新配置();
数据库集成(db=>
{
db.Driver();
db.方言();
db.KeywordsAutoImport=Hbm2DDLKeyWords.AutoQuote;
db.ConnectionString=连接字符串;
db.LogFormattedSql=true;
db.logsqlincole=true;
db.AutoCommentSql=true;
});
返回cfg;
}
}
}
进一步阅读后,ntext
将与文本和图像一起在将来的版本中删除
在未来版本的Microsoft SQL Server中,将删除ntext、text和image数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用nvarchar(max)、varchar(max)和varbinary(max)
所以这个代码会起作用
Property(e => e.Description, m =>
{
m.NotNullable(true);
m.Length(4001); // any value > 4K
});
试过另一段吗?与10562一样,超过8000的值(varchar的SQL server限制)与MaxValue不同,这可能被视为特殊情况值?@SimonSvensson感谢您的建议。如果ntext
,text
和image
数据类型将在SQL Server的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。改用nvarchar(max)
、varchar(max)
和varbinary(max)
@是的,我现在明白了。非常感谢。