2010-08-26 5 views
5

Ich habe zwei Tabellen, Schauplätze und EinrichtungenFließend nHibernate Automapping Erstellung nicht Plural Tabellenname

Sie bilden zwei Klassen,

public Location : Entity 
{ 
    //properties 
} 

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

Alles funktioniert nur Dandy, bis ich Anlage zu dieser

ändern
public Facility : Location 
{ 

} 

Jetzt bekomme ich eine Ausnahme von nHibernate sagen

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

Aus irgendeinem Grund wird der Pluralname der Tabelle nicht in die SQL-Zeichenfolge erstellt.

Danke für jede Hilfe!

EDIT

Dies ist meine aktuelle TableNameConvention

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

Wenn Einrichtung von Entity erbt, wird die Einrichtung durch diese Methode ausgeführt werden. Wenn es von Ort erbt, hat es nicht

Edit 2 bezifferten ich alles schreiben würde ... 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 macht keine Pluralisierung von Tabellennamen oder irgendetwas anderes. Sie müssen eine Konvention erstellen, wie sie David vorgeschlagen hat, und einen der .Net-Inflectors verwenden. –

+0

Das TabellennameConvention ist dort, aber aus irgendeinem Grund, wenn ich Facility ändern, um von Location zu erben, findet das fließende Setup es nicht mehr, wenn es das Assembly durchsucht. –

+0

So wie es aussieht, behandeln Sie Location als eine andere Basisklasse. In diesem Fall könnte Folgendes funktionieren: mappings.IgnoreBase (); Oder gehen Sie für so etwas wie eine Tabelle pro Unterklasse? – David

Antwort

8

Haben Sie einen convention eingestellt?

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

Ja das ist da drin. Aus irgendeinem Grund, wenn ich die Facility ändere, um vom Standort zu übernehmen, erscheint Facility nicht in dieser Tabellennamenskonvention hinzugefügt. –

+0

Euh, interessant. Verwenden Sie eine Vererbungsstrategie? - http://jagregory.com/writings/fluent-nhibernate-auto-mapping-and-base-classes/ – David

+0

Yep. Es sieht genauso aus wie im Beispiel. Hier ist ein Link: http://yfrog.com/1gdhfp –

1

Dies ist eine alte Frage, aber im Interesse des anderen, die auf diesem stolpert nach einer Antwort suchen, können Sie auch eine Konvention erstellen, die die PluralizationService-eingebaut verwendet, die mit EF kommt:

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

    } 
} 
+0

Interessante Mischung von Nhibernate und EF. Wir durften EF vor Jahren nicht für dieses Projekt verwenden. –