如何为许多映射配置nHibernate?

使用nHibernate 3.2,C#4.0,SQL Server 2008 R2 Express

我有两个业务实体 – BrokerMarket 。 它们分别存储在brokersmarkets表中。 我还有一个brokerMarkets表,有一个名为MinIncrement额外列。 Broker和Market之间有很多关系,但只有当我想存储MinIncrement值时(即它是可选的)。 我的课程看起来像这样:

 public class Market : BusinessBase { public Market() {} public virtual int Id { get; set; } public virtual string Symbol { get; set; } public virtual string Description { get; set; } } public class Broker : BusinessBase { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual bool IsDefault { get; set; } public virtual bool IsActive { get; set; } public virtual ISet Accounts { get; set; } } public class BrokerMarket : Market { public BrokerMarket() { } public virtual Broker Broker {get; set;} public virtual decimal MinIncrement { get; set; } } 

我的映射文件如下所示:Market.hbm.xml

                

Broker.hbm.xml

                     

在我的数据访问层中,我有一个添加BrokerMarket的方法:

 public void AddBrokerMarket(BrokerMarket bm) { using (ITransaction tx = _session.BeginTransaction()) { try { _session.Save(bm); _session.Flush(); tx.Commit(); } catch (HibernateException) { tx.Rollback(); throw; } } } 

在我的unit testing中,我尝试添加如下的BrokerMarket:

 [Test] public void CanAddBrokerMarket() { Broker broker = _provider.GetBrokerById(1); Market market = _provider.GetMarketById(2); var brokerMarket = new BrokerMarket { Broker = broker, Description = market.Description, Symbol = market.Symbol, MinIncrement = 0.01M }; _provider.AddBrokerMarket(brokerMarket); } 

当我运行测试时,我收到此错误:

运行测试。 测试’MooDBTests / MooDB / Tests / DataLayerTests / CanAddBrokerMarket’失败:消息NHibernate.MappingException:没有持久性:在NHibernate.Impl.SessionImpl.GetEntityPersister的NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName)的MooDB.BusinessLayer.BrokerMarket堆栈跟踪在NHibernate的NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent事件)的NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object实体,String entityName,Object anything,IEventSource source,Boolean requiresImmediateIdAccess)处于(String entityName,Object obj)。 Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId在NHibernate.Event.Default.DefaultSaveOrUpdateEventListener在NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent事件)(SaveOrUpdateEvent事件)在​​NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent事件)。 NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent事件)在​​NHibernate.Impl.SessionImpl.Save(Object obj)上的OnSaveOrUpdate(SaveOrUpdateEvent事件)NHibernateDataProvider.cs(91,0):在MooDB.DataLayer.NHibernateDataProvider.AddBrokerMarket(BrokerMarket bm) DataLayerTests.cs(81,0):在MooDB.Tests.DataLayerTests.CanAddBrokerMarket()

我不确定我做错了什么。 我是否需要在Market类中添加Broker集合,在Broker类中添加Market集合? 我确实尝试了但是我得到了同样的错误,我认为我在某个地方遗漏了某些东西。

UPDATE

我实现了以下更改:Market.hbm.xml

                      

Broker.hbm.xml

                 

Market类别:

 public class Market : BusinessBase { public Market() {} public virtual int Id { get; set; } public virtual string Symbol { get; set; } public virtual string Description { get; set; } public virtual ISet BrokerMarkets { get; set; } //added this line } 

BrokerMarket

 public class BrokerMarket : Market { public BrokerMarket() { } public virtual Broker Broker {get; set;} public virtual Market Market { get; set; } // added this line public virtual decimal MinIncrement { get; set; } } 

其他一切都没有改变。 我再次运行unit testing,得到:

运行测试。 测试’MooDBTests / MooDB / Tests / DataLayerTests / CanAddBrokerMarket’失败:消息TestFixtureSetUp在DataLayerTests中失败

测试’MooDBTests / MooDB / Tests / DataLayerTests’失败:消息SetUp:NHibernate.MappingException:集合映射中的重复列:MooDB.BusinessLayer.Market.BrokerMarkets列:brokerId

更新2

如果我删除

来自Market.hbm.xml运行unit testing时出现此错误:

运行测试。 测试’MooDBTests / MooDB / Tests / DataLayerTests / CanAddBrokerMarket’失败:消息TestFixtureSetUp在DataLayerTests中失败

测试’MooDBTests / MooDB / Tests / DataLayerTests’失败:消息SetUp:NHibernate.MappingException:MooDB.Mappings.Market.hbm.xml(17,10):XMLvalidation错误:命名空间’urn:nhibernate-中的元素’map’ mapping-2.2’在命名空间’urn:nhibernate-mapping-2.2’中具有无效的子元素’composite-element’。 预期可能元素的列表:’map-key,composite-map-key,map-key-many-to-many,index,composite-index,index-many-to-many,index-many-to-any’in namespace’瓮:nhibernate-mapping-2.2’。 —-> System.Xml.Schema.XmlSchemaValidationException:命名空间’urn:nhibernate-mapping-2.2’中的元素’map’在命名空间’urn:nhibernate-mapping-2.2’中具有无效的子元素’composite-element’。 预期可能元素的列表:’map-key,composite-map-key,map-key-many-to-many,index,composite-index,index-many-to-many,index-many-to-any’in namespace’瓮:nhibernate-mapping-2.2’。

错误可能是因为你还没有为BrokerMarket Class定义映射,如果你想像你所做的那样保存代理市场就必须创建BrokerMarket.hbm.xml。 您也可以在这里查看使用复合元素,例如http://thesoftwaresimpleton.blogspot.com/2010/03/nhibernate-many-to-many-with-extra.html