Hey everyone,
I'm working through a tutorial which uses an older version of NHibernate. I'm trying to use version 3.1.0. However, I get the following error: Could not compile the mapping document: Agathas.Storefront.Repository.NHibernate.Mapping.Basket.hbm.xml. The inner exception of the error is: Could not find the property 'Items', associated to the field '_items', in class 'Agathas.Storefront.Model.Basket.Basket'.
Here's the full stack trace:
Quote:
NHibernate.MappingException was unhandled by user code
Message=Could not compile the mapping document: Agathas.Storefront.Repository.NHibernate.Mapping.Basket.hbm.xml
Source=NHibernate
StackTrace:
at NHibernate.Cfg.Configuration.LogAndThrow(Exception exception) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 342
at NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 530
at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 499
at NHibernate.Cfg.Configuration.ProcessMappingsQueue() in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1832
at NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1823
at NHibernate.Cfg.Configuration.AddXmlReader(XmlReader hbmReader, String name) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 1816
at NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 632
at NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 670
at NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 763
at NHibernate.Cfg.Configuration.AddAssembly(String assemblyName) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 746
at Agathas.Storefront.Repository.NHibernate.SessionFactory.Init() in C:\AspPatterns\Agathas.Storefront\Agathas.Storefront.Repository.NHibernate\SessionFactory.cs:line 18
at Agathas.Storefront.Repository.NHibernate.SessionFactory.GetSessionFactory() in C:\AspPatterns\Agathas.Storefront\Agathas.Storefront.Repository.NHibernate\SessionFactory.cs:line 28
at Agathas.Storefront.Repository.NHibernate.SessionFactory.GetNewSession() in C:\AspPatterns\Agathas.Storefront\Agathas.Storefront.Repository.NHibernate\SessionFactory.cs:line 35
at Agathas.Storefront.Repository.NHibernate.SessionFactory.GetCurrentSession() in C:\AspPatterns\Agathas.Storefront\Agathas.Storefront.Repository.NHibernate\SessionFactory.cs:line 46
at Agathas.Storefront.Repository.NHibernate.Repositories.Repository`2.FindAll() in C:\AspPatterns\Agathas.Storefront\Agathas.Storefront.Repository.NHibernate\Repositories\Repository.cs:line 43
at Agathas.Storefront.Services.Implementations.ProductCatalogService.GetAllCategories() in C:\AspPatterns\Agathas.Storefront\Agathas.Storefront.Services\Implementations\ProductCatalogService.cs:line 90
at Agathas.Storefront.Controllers.Controllers.ProductCatalogBaseController.GetCategories() in C:\AspPatterns\Agathas.Storefront\Agathas.Storefront.Controllers\Controllers\ProductCatalogBaseController.cs:line 25
at Agathas.Storefront.Controllers.Controllers.HomeController.Index() in C:\AspPatterns\Agathas.Storefront\Agathas.Storefront.Controllers\Controllers\HomeController.cs:line 26
at lambda_method(Closure , ControllerBase , Object[] )
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
InnerException: NHibernate.PropertyNotFoundException
Message=Could not find the property 'Items', associated to the field '_items', in class 'Agathas.Storefront.Model.Basket.Basket'
Source=NHibernate
AccessorType=_items
PropertyName=Items
StackTrace:
at NHibernate.Properties.FieldAccessor.GetGetter(Type theClass, String propertyName) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Properties\FieldAccessor.cs:line 70
at NHibernate.Util.ReflectHelper.GetGetter(Type theClass, String propertyName, String propertyAccessorName) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Util\ReflectHelper.cs:line 112
at NHibernate.Util.ReflectHelper.ReflectedPropertyClass(Type theClass, String name, String access) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Util\ReflectHelper.cs:line 150
at NHibernate.Cfg.XmlHbmBinding.CollectionBinder.GetPropertyType(Type containingType, String propertyName, String propertyAccess) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\CollectionBinder.cs:line 892
at NHibernate.Cfg.XmlHbmBinding.CollectionBinder.BindCollection(ICollectionPropertiesMapping collectionMapping, Collection model, String className, String path, Type containingType, IDictionary`2 inheritedMetas) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\CollectionBinder.cs:line 232
at NHibernate.Cfg.XmlHbmBinding.CollectionBinder.CreateBag(HbmBag bagMapping, String prefix, String path, PersistentClass owner, Type containingType, IDictionary`2 inheritedMetas) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\CollectionBinder.cs:line 85
at NHibernate.Cfg.XmlHbmBinding.CollectionBinder.Create(ICollectionPropertiesMapping collectionMapping, String className, String propertyFullPath, PersistentClass owner, Type containingType, IDictionary`2 inheritedMetas) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\CollectionBinder.cs:line 25
at NHibernate.Cfg.XmlHbmBinding.PropertiesBinder.Bind(IEnumerable`1 properties, Table table, IDictionary`2 inheritedMetas, Action`1 modifier, Action`1 addToModelAction) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\PropertiesBinder.cs:line 100
at NHibernate.Cfg.XmlHbmBinding.PropertiesBinder.Bind(IEnumerable`1 properties, IDictionary`2 inheritedMetas, Action`1 modifier) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\PropertiesBinder.cs:line 52
at NHibernate.Cfg.XmlHbmBinding.PropertiesBinder.Bind(IEnumerable`1 properties, IDictionary`2 inheritedMetas) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\PropertiesBinder.cs:line 47
at NHibernate.Cfg.XmlHbmBinding.RootClassBinder.Bind(HbmClass classSchema, IDictionary`2 inheritedMetas) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\RootClassBinder.cs:line 59
at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddRootClasses(HbmClass rootClass, IDictionary`2 inheritedMetas) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\MappingRootBinder.cs:line 83
at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddEntitiesMappings(HbmMapping mappingSchema, IDictionary`2 inheritedMetas) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\MappingRootBinder.cs:line 42
at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(HbmMapping mappingSchema) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\XmlHbmBinding\MappingRootBinder.cs:line 29
at NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName) in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Cfg\Configuration.cs:line 522
InnerException:
The web.config:
Code:
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver
</property>
<property name="connection.connection_string">
Data Source=*****;Initial Catalog=Shop;Integrated Security=True
</property>
<property name="adonet.batch_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="use_outer_join">true</property>
<property name="command_timeout">60</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<property name="proxyfactory.factory_class">
NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu
</property>
</session-factory>
</hibernate-configuration>
The mapping file:
Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Agathas.Storefront.Model.Basket"
assembly="Agathas.Storefront.Model">
<class name="Basket" table="Baskets" lazy="false" >
<id name="Id" column="BasketId" type="guid">
<generator class="guid" />
</id>
<bag name="Items" access="field.camelcase-underscore" inverse="true"
cascade="all-delete-orphan" lazy="true" >
<key column="BasketId"/>
<one-to-many class="BasketItem"></one-to-many>
</bag>
<many-to-one access="field.camelcase-underscore" name="DeliveryOption"
class="Agathas.Storefront.Model.Shipping.DeliveryOption"
column="DeliveryOptionId"
not-null="true"/>
</class>
</hibernate-mapping>
and finally, the class itself:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using Agathas.Storefront.Infrastructure.Domain;
using Agathas.Storefront.Model.Products;
using Agathas.Storefront.Model.Shipping;
namespace Agathas.Storefront.Model.Basket
{
public class Basket : EntityBase<Guid>, IAggregateRoot
{
private IList<BasketItem> _items;
private IDeliveryOption _deliveryOption;
public Basket()
{
_items = new List<BasketItem>();
_deliveryOption = new NullDeliveryOption();
}
public int NumberOfItems
{
get { return _items.Sum(i => i.Qty); }
}
public decimal BasketTotal
{
get { return ItemsTotal + DeliveryCost(); }
}
public decimal ItemsTotal
{
get { return _items.Sum(i => i.Qty * i.Product.Price); }
}
public void Add(Product product)
{
if (BasketContainsAnItemFor(product))
GetItemFor(product).IncreaseItemQtyBy(1);
else
_items.Add(BasketItemFactory.CreateItemFor(product, this));
}
public BasketItem GetItemFor(Product product)
{
return _items.Where(i => i.Contains(product)).FirstOrDefault();
}
private bool BasketContainsAnItemFor(Product product)
{
return _items.Any(i => i.Contains(product));
}
public void Remove(Product product)
{
if (BasketContainsAnItemFor(product))
{
_items.Remove(GetItemFor(product));
}
}
public void ChangeQtyOfProduct(int qty, Product product)
{
if (BasketContainsAnItemFor(product))
{
GetItemFor(product).ChangeItemQtyTo(qty);
}
}
public int NumberOfItemsInBasket()
{
return _items.Sum(i => i.Qty);
}
public IEnumerable<BasketItem> Items()
{
return _items;
}
public decimal DeliveryCost()
{
return DeliveryOption.GetDeliveryChargeForBasketTotalOf(ItemsTotal);
}
public IDeliveryOption DeliveryOption
{
get { return _deliveryOption; }
}
public void SetDeliveryOption(IDeliveryOption deliveryOption)
{
_deliveryOption = deliveryOption;
}
protected override void Validate()
{
if (DeliveryOption == null)
base.AddBrokenRule(BasketBusinessRules.DeliveryOptionRequired);
foreach (BasketItem item in this.Items())
{
if (item.GetBrokenRules().Count() > 0)
base.AddBrokenRule(BasketBusinessRules.ItemInvalid);
}
}
}
}
_items is a private field, which for some reason is causing the problem. Any ideas where I'm going wrong, here?