11

Używamy Fluent NHibernate do modelu obiektów danych w firmie, w której pracuję. Kilka dni temu napotkaliśmy problem, że Fluent NHibernate generuje dodatkową kolumnę, która nie istnieje ani w modelu, ani w mapowaniu. Oto sytuacja:Fluent NHibernate generuje dodatkowe kolumny

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; } 
} 

Moja Mapowanie:

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

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

Po zbudowaniu schematu z następującego kodu,

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(); 

Dodatkowy kolumna o nazwie "SecondClass_id" jest tworzona z indeksem i kluczem obcym do tabeli SecondClass z kolumną Id. Oto tabela produkowane:

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; 

Uważam, że jeśli zmienić nazwę „MyReference” na „secondClass” (nazwa taka sama jak typ klasy), nie ma dodatkowych kolumna utworzona. Ale chcę użyć mojej własności z określoną nazwą, a nie nazwą klasy. Dlaczego ta dodatkowa kolumna jest tworzona? Jak to naprawić? Nie chcę, żeby kręciły się dodatkowe kolumny kluczy obcych.

+1

masz na myśli, że jeśli zmienisz nazwę właściwości inną niż nazwa obiektu, utworzy dwa pola jeden to twoja_nazwa_włosa druga to nazwa_obiektu? – gandil

+0

Zdecydowanie. Jakieś pomysły, dlaczego? – SadullahCeran

+0

Brzmi dziwnie. Co się stanie, jeśli wyraźnie podasz nazwę kolumny. References (x => x.MyReference, "SecondClass_id"); –

Odpowiedz

18

Zdarza się to często, gdy używasz FNH i masz dwukierunkową relację między elementami.

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); 
    } 
} 

Aby to naprawić trzeba zastąpić nazwę kolumny używane w żadnym ClassMap, tak:

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

lub:

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

Powodem tego jest to, że FNH traktuje każdy mapowanie jako osobna relacja, dzięki czemu tworzone są różne kolumny, klucze i indeksy.

+0

Dziękuję za wspaniałą odpowiedź, spróbuję, – SadullahCeran

+0

'HasMany()' nie ma metody 'Column()', zamiast tego użyj 'KeyColumn()'. –

+0

@ Gweebz dziękuję za odkrycie mojej literówki, zaktualizowałem moją odpowiedź. –