Как вы можете использовать Fluent NHibernate AutoMapping и hbm2ddl для генерации оператора DDL с обнуляемыми столбцами MySql? - PullRequest
1 голос
/ 18 декабря 2010

Я создал простой пример кода с обнуляемыми и ненулевыми целыми числами и свойствами 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();
    }
}
...