2011-08-17 2 views
0

FluentNHibernate를 자동 매핑과 함께 사용합니다. 사용자 지정 규칙이나 변경 내용이 사용되지 않습니다. NHibernate와 FluentNHibernate 어셈블리는 모두 최신 버전이다.FluenNibernate .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(*)"); 
    } 
} 

I 자동 스키마를 생성 : 데이터베이스 나는 다음과 같은 엔티티 (계층 당 테이블)를 사용하려고 sqlite3를

입니다.

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.AssemblyOf<Person>(cfg) 
    .UseOverridesFromAssemblyOf<PersonMappingOverride>(); 

위는 대답을 http://wiki.fluentnhibernate.org/Auto_mapping#Overrides

+0

탱크에서 당신을 찍은! 그것은 나를 위해 놀랍지 만 당신 말이 맞습니다! 설치 방법을 비슷하게 설정했지만 문제는 내 엔티티가 하나의 AppDomain에 있지만 구성을 다른 구성으로 만듭니다. 따라서 유형 평등 비교 (IAutoMappingOverride의 일반 기반)는 항상 거짓입니다. 도움을 주셔서 감사합니다. – ILya