Как вы можете использовать Fluent NHibernate AutoMapping и hbm2ddl для генерации оператора DDL с обнуляемыми столбцами MySql?
Я создал простой пример кода с обнуляемыми и ненулевыми целыми числами и свойствами datetime:
public class Person {
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual int Length { get; set; }
public virtual int? LengthNullable { get; set; }
public virtual DateTime BirthDate { get; set; }
public virtual DateTime? BirthDateNullable { get; set; }
}
Я хотел бы позволить классу "NHibernate.Tool.hbm2ddl.SchemaExport" сгенерировать следующий оператор DDL:
create table `Person` (
Id INTEGER NOT NULL AUTO_INCREMENT,
Name VARCHAR(255),
Length INTEGER not null,
LengthNullable INTEGER null,
BirthDate DATETIME not null,
BirthDateNullable DATETIME null,
primary key (Id)
)
Однако, когда я выполню код дальше, вместо этого будет сгенерирован следующий DDL:
create table `Person` (
Id INTEGER NOT NULL AUTO_INCREMENT,
Name VARCHAR(255),
Length INTEGER,
LengthNullable INTEGER,
BirthDate DATETIME,
BirthDateNullable DATETIME,
primary key (Id)
)
Как вы можете видеть, генератор DDL, похоже, не в состоянии сделать различие между "int?" и "int" (или между "DateTime?" и "DateTime") для генерации предложений "null" или "not null". Эта функция просто не поддерживается, или я делаю что-то не так?
Я протестировал обе следующие комбинации версий:
"NHibernate 2.1.2.400" и "Fluent NHibernate 1.1.0.685"
"NHibernate 3.0.0.400" и "Fluent NHibernate 1.2.0.694"
но с таким же неудачным результатом
Ниже приведен мой класс "FluentNHibernateTableExporter", который я использовал для генерации вышеупомянутого оператора DDL:
using FluentNHibernate.Automapping;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate.Tool.hbm2ddl;
public class MyAutomappingConfiguration : DefaultAutomappingConfiguration
{
public override bool ShouldMap(Type type)
{
return type.Namespace == typeof(Person).Namespace;
}
}
public class FluentNHibernateTableExporter
{
public static void ExportMySqlSchema()
{
Fluently
.Configure()
.Database(
MySQLConfiguration.Standard.ConnectionString(
cs => cs
.Server("localhost")
.Database("MyDatabase")
.Username("MyUserName")
.Password("MyPassword")
).ShowSql()
)
.Mappings(
m => m.AutoMappings.Add(
AutoMap.AssemblyOf<Person>(new MyAutomappingConfiguration())
)
)
.ExposeConfiguration(
config =>
{
var schemaExport = new SchemaExport(config); // NHibernate.Tool.hbm2ddl
schemaExport.Execute(true, true, false);
}
)
.BuildConfiguration();
}
}