2010-08-26 75 views
5

我有两个表,场所和设施功能NHibernate自动映射没有创造多元的表名

它们映射到两个班,

public Location : Entity 
{ 
    //properties 
} 

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

一切工作只是花花公子,直到我改变设施,以这种

public Facility : Location 
{ 

} 

现在我从nHibernate得到一个异常说

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

由于某些原因,它不是将表的复数名称创建为sql字符串。

感谢您的帮助!

编辑

这是我目前TableNameConvention

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

当基金从实体继承,该基金也通过这种方法运行。当它从位置继承,它没有

编辑2 想我会发布的一切...... 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

流利的NHibernate不会做表格名称的任何复数形式,或其他任何事情。您需要创建一个像David所建议的公约,并利用其中一个.Net访问器。 – 2010-08-26 21:56:19

+0

tableNameConvention在那里,但由于某些原因,当我将Facility更改为从Location继承时,Fluent安装程序在扫描程序集时不再发现它。 – 2010-08-26 22:18:49

+0

按原样,它看起来像是将Location定位为另一个基类,在这种情况下,以下内容可能会有效: mappings.IgnoreBase (); 或者正在寻找像每个子类一样的东西? – David 2010-08-26 22:48:55

回答

8

您是否设置了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

是的,在那里。出于某种原因,当我将工具更改为从位置继承时工具不会显示在此表名称约定中。 – 2010-08-26 21:57:39

+0

恩,有趣。那么你是否使用继承策略? - http://jagregory.com/writings/fluent-nhibernate-auto-mapping-and-base-classes/ – David 2010-08-26 22:11:48

+0

是的。它看起来就像这个例子中的那个。这里是一个链接:http://yfrog.com/1gdhfp – 2010-08-26 22:27:07

1

这是一个老问题,但为他人着想在此寻找一个答案谁绊倒,你也可以创建一个使用惯例内置PluralizationService附带EF:

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

    } 
} 
+0

nhibernate和EF的有趣混合。几年前我们不允许将EF用于这个项目。 – 2013-05-28 18:26:05