Свободный NHibernate генерирует дополнительные столбцы - PullRequest
11 голосов
/ 19 мая 2011

Мы используем Fluent NHibernate для модели объектов данных в компании, в которой я работаю.Пару дней назад мы столкнулись с проблемой, что Fluent NHibernate генерирует дополнительный столбец, который не существует ни в модели, ни в отображении.Вот ситуация:

Моя модель: FirstClass.cs

public class FirstClass
{
    public virtual int Id { get; private set; }
    public virtual SecondClass MyReference { get; set; }
    public virtual DateTime DecisionDate { get; set; }
}

Мое сопоставление:

public class FirstClassMap : ClassMap<FirstClass>
{
    public FirstClassMap()
    {
        Id(x => x.Id);
        Map(x => x.DecisionDate);

        References(x => x.MyReference);
    }
}

После построения схемы со следующим кодом,

Instance._sessionFactory = Fluently.Configure()
                .Database(MySQLConfiguration.Standard
                    .ConnectionString(connectionString)
                    .ShowSql())
                .ExposeConfiguration(c =>
                {
                    c.Properties.Add("current_session_context_class", ConfigurationHelper.getSetting("SessionContext"));
                })
                .ExposeConfiguration(BuildSchema)
                .Mappings( m => m.FluentMappings.AddFromAssemblyOf<Community>())
                .BuildSessionFactory();

Создается дополнительный столбец с именем "SecondClass_id" с индексом и внешним ключом для таблицы SecondClass со столбцом Id.Вот созданная таблица:

CREATE TABLE `FirstClass` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `DecisionDate` datetime DEFAULT NULL,
  `MyReference_id` int(11) DEFAULT NULL,
  `SecondClass_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`Id`),
  KEY `MyReference_id` (`MyReference_id`),
  KEY `SecondClass_id` (`SecondClass_id`),
  CONSTRAINT `FK4AFFB59B2540756F` FOREIGN KEY (`MyReference_id`) REFERENCES `SecondClass` (`Id`),
  CONSTRAINT `FK4AFFB59B51EFB484` FOREIGN KEY (`SecondClass_id`) REFERENCES `SecondClass` (`Id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Я обнаружил, что, если я переименую «MyReference» в «SecondClass» (то же имя, что и у типа класса), дополнительный столбец не будет создан.Но я хочу использовать мое свойство с указанным именем, а не с именем класса.Почему этот дополнительный столбец создается?Как мне это исправить?Я не хочу, чтобы вокруг висели дополнительные столбцы с внешними ключами.

1 Ответ

18 голосов
/ 09 июня 2011

Это часто случается, когда вы используете FNH и у вас есть двусторонние отношения между сущностями.

public class FirstClass
{
    public virtual SecondClass MyReference { get; set; }
}

public class SecondClass
{
    public virtual List<FirstClass> ListOfFirstClass { get; set; }
}

public class FirstClassMap : ClassMap<FirstClass>
{
    public FirstClassMap()
    {
        References(x => x.MyReference);
    }
}

public class SecondClassMap : ClassMap<SecondClass>
{
    public SecondClassMap()
    {
        HasMany(x => x.ListOfFirstClass);
    }
}

Чтобы исправить это, вы должны переопределить имя столбца, используемое в любом из ClassMap, например:

public class SecondClassMap : ClassMap<SecondClass>
{
    public SecondClasssMap()
    {
        HasMany(x => x.ListOfFirstClass).KeyColumn("MyReference_id");
    }
}

или

public class FirstClassMap : ClassMap<FirstClass>
{
    public FirstClassMap()
    {
        References(x => x.MyReference).Column("SecondClass_id");
    }
}

Причина этого в том, что FNH рассматривает каждое отображение как отдельное отношение, поэтому создаются разные столбцы, ключи и индексы.

...