11

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

My Model: FirstClass.cs

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

Мой Mapping:

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

Вы имеете в виду, если вы измените имя свойства, отличное от имени объекта, оно создает два поля, одно из которых - ваше_отображение другое - имя_объекта? – gandil

+0

Определенно. Любые идеи почему? – SadullahCeran

+0

Звучит странно. Что произойдет, если вы явно укажете имя столбца. Ссылки (x => x.MyReference, "SecondClass_id"); –

ответ

18

Это часто случается, когда вы используете 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 обрабатывает каждый отображение как отдельное отношение, поэтому создаются разные столбцы, ключи и индексы.

+0

Спасибо за отличный ответ. Я дам ему попробовать. – SadullahCeran

+0

'HasMany()' не имеет метода 'Column()', вместо этого используйте 'KeyColumn()'. –

+0

@Gweebz благодарит вас за то, что выучил мою опечатку, я обновил свой ответ. –

Смежные вопросы