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
ändernpublic 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 ...
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<>));
}
}
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. –
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. –
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