Как вы можете использовать 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();
    }
}

0 ответов

Другие вопросы по тегам