Tôi có hai bảng, địa điểm và thiết bịthành thạo NHibernate automapping không tạo tên bảng Plural
Họ bản đồ để hai lớp,
public Location : Entity
{
//properties
}
public Facility : Entity
{
public virtual Location Location { get; set; }
}
Tất cả mọi thứ hoạt động giống dandy, cho đến khi tôi thay đổi cơ sở để
nàypublic Facility : Location
{
}
Bây giờ tôi có ngoại lệ từ nHibernate nói
NHibernate.ADOException was unhandled by user code
Message=could not execute query
InnerException: System.Data.SqlClient.SqlException
Message=Invalid object name 'Facility'.
Vì một số lý do, nó không tạo tên số nhiều của bảng vào chuỗi sql.
Cảm ơn bạn đã trợ giúp!
EDIT
Đây là TableNameConvention hiện tại của tôi
public class TableNameConvention : IClassConvention
{
public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance)
{
instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name));
}
}
Khi cơ sở kế thừa từ Entity, Quỹ không chạy qua phương pháp này. Khi nó được thừa hưởng từ Vị trí, nó không
Chỉnh sửa 2 figured tôi muốn gửi tất cả mọi thứ ...
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<>));
}
}
Lưu loát NHibernate không làm bất kỳ số nhiều tên bảng nào, hoặc bất kỳ thứ gì khác cho vấn đề đó. Bạn cần phải tạo ra một quy ước như David đề xuất và sử dụng một trong các .Net inflectors ra khỏi đó. –
tableNameConvention là ở đó, nhưng vì một số lý do khi tôi thay đổi cơ sở để kế thừa từ vị trí, thiết lập thông thạo không còn tìm thấy nó khi nó quét lắp ráp. –
Giống như, có vẻ như bạn đang coi Vị trí là một lớp cơ sở khác, trong trường hợp này, điều sau có thể hoạt động: mappings.IgnoreBase(); Hoặc đang đi cho một cái gì đó giống như một bảng cho mỗi phân lớp? –
David