2010-05-08 105 views
2

,并首先感谢您的时间来看待这个的。系列抽象类和NHibernate

对于我工作的一个研究项目,我有一个比较复杂的设计(我一直在考虑)坚持通过NHibernate的数据库。

这里的类层次结构的一个例子:

alt text http://img215.imageshack.us/img215/3998/transit.png

TransitStrategy,TransportationCompany和TransportationLocation都是抽象类。

XML配置我目前是:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="Vacationizer" 
       namespace="Vacationizer.Domain.Transit"> 

<class name="TransitStrategy"> 

    <id name="TransitStrategyId"> 
     <generator class="guid" /> 
    </id> 

    <property name="Restrictions" /> 

    <joined-subclass name="Flight" table="Flight_TransitStrategy"> 

     <key column="TransitStrategyId" /> 

     <property name="DepartingAirport" /> 
     <property name="ArrivingAirport" /> 
     <property name="Airline" /> 
     <property name="FlightNumber" /> 
     <property name="FlightArrivalTime" /> 
     <property name="FlightDepartureTime" /> 

    </joined-subclass> 

    <joined-subclass name="RentalCar" table="RentalCar_TransitStrategy"> 

     <key column="TransitStrategyId" /> 

     <property name="RentalCarBranch" /> 
     <property name="CarMake" /> 
     <property name="CarModel" /> 
     <property name="CarYear" /> 
     <property name="CarColor" /> 
     <property name="RentalBegins" /> 
     <property name="RentalEnds" /> 

    </joined-subclass> 

</class> 

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="Vacationizer" 
       namespace="Vacationizer.Domain.Transit"> 

<class name="TransportationCompany"> 

    <id name="TransportationCompanyId"> 
     <generator class="guid" /> 
    </id> 

    <property name="Name" /> 
    <property name="Reviews" /> 
    <property name="Website" /> 
    <property name="Photo" /> 

    <joined-subclass name="Airline" table="Airline_TransportationCompany"> 

     <key column="TransportationLocationId" /> 

    </joined-subclass> 

    <joined-subclass name="RentalCarAgency" table="RentalCarAgency_TransportationCompany"> 

     <key column="TransportationLocationId" /> 

    </joined-subclass> 

</class> 

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="Vacationizer" 
       namespace="Vacationizer.Domain.Transit"> 

<class name="TransportationLocation"> 

    <id name="TransportationLocationId"> 
     <generator class="guid" /> 
    </id> 

    <property name="Name" /> 
    <property name="Image" /> 
    <property name="Geolocation" /> 
    <property name="Reviews" /> 
    <!-- <property name="HoursOpen" />--> 
    <property name="PhoneNumber" /> 
    <property name="FaxNumber" /> 

    <joined-subclass name="Airport" table="Airport_TransportationLocation"> 

     <key column="TransportationLocationId" /> 

     <property name="AirportCode" /> 
     <property name="Website" /> 

    </joined-subclass> 

    <joined-subclass name="RentalCarBranch" table="RentalCarBranch_TransportationLocation"> 

     <key column="TransitStrategyId" /> 

     <property name="Agency" /> 

    </joined-subclass> 

</class> 

但是,每当我尝试使用这个模式我得到这个错误/堆栈跟踪:

------ Test started: Assembly: Vacationizer.Tests.dll ------ 

TestCase 'M:Vacationizer.Tests.VacationRepository_Fixture.TestFixtureSetUp' 
failed: Could not compile the mapping document:  Vacationizer.Mappings.TransitStrategy.hbm.xml 
    NHibernate.MappingException: Could not compile the mapping document: Vacationizer.Mappings.TransitStrategy.hbm.xml ---> NHibernate.MappingException: Problem trying to set property type by reflection ---> NHibernate.MappingException: class Vacationizer.Domain.Transit.RentalCar, Vacationizer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null not found while looking for property: RentalCarBranch ---> NHibernate.PropertyNotFoundException: Could not find a getter for property 'RentalCarBranch' in class 'Vacationizer.Domain.Transit.RentalCar' 
    at NHibernate.Properties.BasicPropertyAccessor.GetGetter(Type type, String propertyName) 
    at NHibernate.Util.ReflectHelper.ReflectedPropertyClass(String className, String name, String accessorName) 
     --- End of inner exception stack trace --- 
    at NHibernate.Util.ReflectHelper.ReflectedPropertyClass(String className, String name, String accessorName) 
    at NHibernate.Mapping.SimpleValue.SetTypeUsingReflection(String className, String propertyName, String accesorName) 
     --- End of inner exception stack trace --- 
    at NHibernate.Mapping.SimpleValue.SetTypeUsingReflection(String className, String propertyName, String accesorName) 
    at NHibernate.Cfg.XmlHbmBinding.ClassBinder.CreateProperty(IValue value, String propertyName, String className, XmlNode subnode, IDictionary`2 inheritedMetas) 
    at NHibernate.Cfg.XmlHbmBinding.ClassBinder.PropertiesFromXML(XmlNode node, PersistentClass model, IDictionary`2 inheritedMetas, UniqueKey uniqueKey, Boolean mutable, Boolean nullable, Boolean naturalId) 
    at NHibernate.Cfg.XmlHbmBinding.JoinedSubclassBinder.HandleJoinedSubclass(PersistentClass model, XmlNode subnode, IDictionary`2 inheritedMetas) 
    at NHibernate.Cfg.XmlHbmBinding.ClassBinder.PropertiesFromXML(XmlNode node, PersistentClass model, IDictionary`2 inheritedMetas, UniqueKey uniqueKey, Boolean mutable, Boolean nullable, Boolean naturalId) 
    at NHibernate.Cfg.XmlHbmBinding.RootClassBinder.Bind(XmlNode node, HbmClass classSchema, IDictionary`2 inheritedMetas) 
    at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddRootClasses(XmlNode parentNode, IDictionary`2 inheritedMetas) 
    at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(XmlNode node) 
    at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc) 
     --- End of inner exception stack trace --- 
    at NHibernate.Cfg.Configuration.LogAndThrow(Exception exception) 
    at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc) 
    at NHibernate.Cfg.Configuration.ProcessMappingsQueue() 
    at NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document) 
    at NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader, String name) 
    at NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name) 
    at NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly) 
    at NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly) 
    at NHibernate.Cfg.Configuration.AddAssembly(String assemblyName) 
    at NHibernate.Cfg.Configuration.DoConfigure(IHibernateConfiguration hc) 
    at NHibernate.Cfg.Configuration.Configure() 
    VacationRepository_Fixture.cs(24,0): at Vacationizer.Tests.VacationRepository_Fixture.TestFixtureSetUp() 

0 passed, 1 failed, 0 skipped, took 8.38 seconds (Ad hoc). 

关于如何以不同方式实现这一点的任何想法?非常感谢!

回答

2

错误本身是明确的:对于RentalCar映射定义一个RentalCarBranch性质,可能不声明(检查是否有错别字,我个人倒属性命名为Branch代替)。

还有另一个错误:当所有持久实体引用应声明为<many-to-one>时,您将所有内容定义为<property>

+0

迭戈, 非常感谢您的投入,但是这是我在复制了这个问题的一部分出现故障。你完全正确,因为你的解决方案可以解决它,但我相信另一个问题就是在发挥作用。 7点,我刚得到它的工作,但也有在该方式得到了不少并发症较多。如果它通过我的单元测试套件,我会在稍后发布我的修复程序。 再次感谢您的帮助! – 2010-05-10 11:06:02

0

从我看到的例外情况来看,这是说你的RentalCar类没有声明RentalCarBranch属性。

是这样吗?

+0

尼尔,请参阅上述评论我要发迭。虽然非常感谢! – 2010-05-10 11:06:31