2010-08-26 10 views
5

Mam dwie tabele, miejsc i obiektówFluent NHibernate Automapping nie tworzenie liczby mnogiej nazwę tabeli

map one do dwóch klas,

public Location : Entity 
{ 
    //properties 
} 

public Facility : Entity 
{ 
    public virtual Location Location { get; set; } 
} 

wszystko działa tylko dandys, dopóki nie zmieni obiekt do tego

public Facility : Location 
{ 

} 

teraz otrzymuję wyjątek od nHibernate mówiąc

NHibernate.ADOException was unhandled by user code 
    Message=could not execute query 
InnerException: System.Data.SqlClient.SqlException 
     Message=Invalid object name 'Facility'. 

Z jakiegoś powodu nie tworzy to liczby mnogiej tabeli w ciągu znaków sql.

Dzięki za pomoc!

EDIT

To jest mój obecny TableNameConvention

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance) 
    { 
     instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name)); 
    } 
} 

Kiedy Obiekt dziedziczy z jednostki, instrument działa dzięki tej metodzie. Kiedy dziedziczy od lokalizacji, nie

Edycja 2 zorientowali będę pisać wszystko ... Database diagram

public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator 
{ 

    #region IAutoPersistenceModelGenerator Members 

    public AutoPersistenceModel Generate() 
    { 
     var mappings = new AutoPersistenceModel(); 
     mappings.AddEntityAssembly(typeof(Person).Assembly).Where(GetAutoMappingFilter); 
     mappings.Conventions.Setup(GetConventions()); 
     mappings.Setup(GetSetup()); 
     mappings.IgnoreBase<Entity>(); 
     mappings.IgnoreBase(typeof(EntityWithTypedId<>)); 
     mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>(); 

     return mappings; 

    } 

    #endregion 

    private Action<AutoMappingExpressions> GetSetup() 
    { 
     return c => 
     { 
      c.FindIdentity = type => type.Name == "Id"; 
     }; 
    } 

    private Action<IConventionFinder> GetConventions() 
    { 
     return c => 
     { 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.ForeignKeyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.HasManyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.HasManyToManyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.ManyToManyTableNameConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.PrimaryKeyConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.ReferenceConvention>(); 
      c.Add<BHP.DEC.Data.NHibernateMaps.Conventions.TableNameConvention>(); 
     }; 
    } 

    /// <summary> 
    /// Provides a filter for only including types which inherit from the IEntityWithTypedId interface. 
    /// </summary> 

    private bool GetAutoMappingFilter(Type t) 
    { 
     return t.GetInterfaces().Any(x => 
             x.IsGenericType && 
             x.GetGenericTypeDefinition() == typeof(IEntityWithTypedId<>)); 
    } 
} 
+0

Fluent NHibernate nie wykonuje żadnych pluralizacji nazw tabel ani niczego innego w tym zakresie. Musisz stworzyć konwencję, taką jak David, zasugerował i wykorzystał jeden z infertorów .Net. –

+0

TableNameConvention jest tam, ale z jakiegoś powodu, kiedy zmieniam obiekt, aby dziedziczyć z lokalizacji, płynna konfiguracja nie znajduje go już podczas skanowania złożenia. –

+0

Wygląda na to, że traktujesz Lokalizację jako inną klasę podstawową, w takim przypadku mogą działać następujące elementy: mapowania.IgnoreBase (); A może chodzi o coś podobnego do tabeli na podklasę? – David

Odpowiedz

8

Czy ustawić convention?

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance) 
    { 
     string typeName = instance.EntityType.Name; 

     instance.Table(Inflector.Net.Inflector.Pluralize(typeName)); 
    } 
} 
+0

Tak, to tam. Z jakiegoś powodu, kiedy zmieniam obiekt, który ma odziedziczyć obiekt z położenia, nie pojawia się w konwencji nazw tej tabeli. –

+0

Euh, interesujące. Czy używasz strategii dziedziczenia? - http://jagregory.com/writings/fluent-nhibernate-auto-mapping-and-base-classes/ – David

+0

Tak. Wygląda dokładnie tak, jak w przykładzie. Oto link: http://yfrog.com/1gdhfp –

1

To stara sprawa, ale dla dobra innych, którzy potknie to patrząc na odpowiedź, można również stworzyć konwencję, która wykorzystuje wbudowany PluralizationService że pochodzi z EF:

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(IClassInstance instance) 
    { 
     string typeName = instance.EntityType.Name; 
     instance.Table(PluralizationService.CreateService(CultureInfo.CurrentCulture).Pluralize(typeName)); 

    } 
} 
+0

Interesująca mieszanka nhibernate i EF. Nie mogliśmy używać EF do tego projektu wiele lat temu. –

Powiązane problemy