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'
有什么不对?它应该工作吗?
罐中取出你的答案!这令我感到惊讶,但你是对的!我以类似于您的示例方式设置我的配置,但问题是我的实体在一个AppDomain中,但我在另一个AppDomain中创建配置。所以类型相等比较(IAutoMappingOverride的泛型基)始终为false。感谢您的帮助 – ILya 2011-08-18 07:48:29