2011-08-17 59 views
0

我使用FluentNHibernate和AutoMapping。 不使用自定义约定或更改。 NHibernate和FluentNHibernate程序集都是最新版本。数据库是SQLITE3FluenNHibernate .Formula(“...”)不起作用

我尝试使用下面的实体(每一个分层表):

public abstract class Unit 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

public class Employee : Unit 
{  
    public Employee() 
    { 
    this.Groups = new List<Group>(); 
    } 

    public virtual IList<Group> Groups { get; private set; }  
} 

public class Group : Unit 
{ 
    public Group() 
    { 
    this.Employees = new List<Employee>(); 
    } 

    public virtual int EmployeesCount { get; set; } 

    public virtual IList<Employee> Employees { get; private set; } 

} 

public class GroupAutoMappingOverride : IAutoMappingOverride<Group> 
{ 
    public void Override (AutoMapping<Group> mapping) 
    { 
    mapping.Map(g => g.EmployeesCount).Formula("count(*)"); 
    } 
} 

我自动生成模式。一切都很好:

create table "Unit" (
    Id integer, 
    TypeId TEXT not null, //discriminator column 
    Name TEXT, 
    primary key (Id) 
) 

create table EmployeesToGroups (
    Employee_id INTEGER not null, 
    Group_id INTEGER not null 
) 

我检查了自动生成的映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class xmlns="urn:nhibernate-mapping-2.2" name="App.Models.Entities.Unit, App, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Unit`"> 
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="identity" /> 
    </id> 
    <discriminator type="String"> 
     <column name="TypeId" /> 
    </discriminator> 
    <property name="Name" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Name" /> 
    </property> 
    <subclass name="App.Models.Entities.Employee, App, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <bag access="backfield" name="Groups" table="GroupToEmployee"> 
     <key> 
      <column name="Employee_id" /> 
     </key> 
     <many-to-many class="App.Models.Entities.Group, App, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"> 
      <column name="Group_id" /> 
     </many-to-many> 
     </bag>  
    </subclass> 
    <subclass name="App.Models.Entities.Group, App, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"> 
     <bag access="backfield" inverse="true" name="Employees" table="EmployeeToGroup"> 
     <key> 
      <column name="Group_id" /> 
     </key> 
     <many-to-many class="App.Models.Entities.Employee, App, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"> 
      <column name="Employee_id" /> 
     </many-to-many> 
     </bag> 
     <property name="EmployeesCount" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="EmployeesCount" /> 
     </property> 
    </subclass> 
    </class> 
</hibernate-mapping> 

嗯..没有公式......当我试图从组中的所有记录,我得到一个异常:

SQLite error 
no such column: group0_.EmployeesCount 

生成的查询是错误的:

NHibernate: select group0_.Id as Id6_, group0_.Name as Name6_, **group0_.EmployeesCount** as Employee9_6_ from "Unit" group0_ where group0_.TypeId='App.Models.Entities 
.Group' 

有什么不对?它应该工作吗?

回答

1

看来您的映射覆盖正在被考虑。如果这是你应该看到像这样在映射文件:

<property name="EmployeesCount" formula="count(*)" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 

有建立映射时类似下面你包括你的映射覆盖:

“要使用覆盖,您需要指示你的自动地图实例来使用它们,通常这将在流畅的配置设置环境中完成,但我只是用自己的AutoMap进行说明。“

AutoMap.AssemblyOf<Person>(cfg) 
    .UseOverridesFromAssemblyOf<PersonMappingOverride>(); 

以上是从http://wiki.fluentnhibernate.org/Auto_mapping#Overrides

+0

罐中取出你的答案!这令我感到惊讶,但你是对的!我以类似于您的示例方式设置我的配置,但问题是我的实体在一个AppDomain中,但我在另一个AppDomain中创建配置。所以类型相等比较(IAutoMappingOverride的泛型基)始终为false。感谢您的帮助 – ILya 2011-08-18 07:48:29