柚子Nan--回归原点

Everything can be as easy as you like or as complex as you need.
posts - 232, comments - 984, trackbacks - 17, articles - 29
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

NHibernate使用手迹(2nd—extension)

Posted on 2005-05-31 09:59 柚子Nan 阅读(2111) 评论(14)  编辑 收藏 所属分类: [技术.Net]

在做顾客银行这个例子的时候,怎么也进行不下去了,遇到了如下一个错误:Object type cannot be converted to target type.


我想做的事情是这样的:我把需求稍微改动了一下,
CustomerBank不再是one-to-one了,而是one-to-many.
那么我在配置文件中改成:

Customer.hbm.xml

<bag name="CustomerBanks"

             cascade="all"

             order-by="BankName asc">

             <key column="CustomerID" />

             <one-to-many class="Data.Bank, Data"/>

        </bag>

 

Bank.hbm.xml

<many-to-one name="BankCustomer" class="Data.Customer, Data"

                     cascade="all" outer-join="auto"                  

                     column="CustomerID"

                     not-null="false" />


详细的配置文件、
Domain Model DB Model在此下载
然后我想插入Customer的时候同时插入Bank,实现代码如下
           Customer aCustomer = new Customer();

           aCustomer.CustomerTitle = "Developer";

           aCustomer.CustomerAge = 25;

           aCustomer.UpdateTimestamp = DateTime.Now;

 

           Bank aBank = new Bank();

          

           aBank.BankName = "CICB";

           aBank.Banlance = 1233453.234M;

           aBank.UpdateTimestamp = aCustomer.UpdateTimestamp;

 

           // bind the two object to each other.

           aBank.BankCustomer = aCustomer;

           aCustomer.CustomerBanks.Add(aBank);

 

           aEntityRule.Save(aCustomer);

为什么出现错误,Object type cannot be converted to target type.

我用SQL Profile察看,发现根本没有生成任何SQL 语句,请指点一下哪里错了

Feedback

#1楼    回复  引用    

2005-05-31 11:23 by jjx [未注册用户]
custumerBanks 声明为 IList而不是ArrayList
nhibernate使用自己的集合类的

#2楼    回复  引用    

2005-05-31 11:25 by donaldxu [未注册用户]
查一下 aBank.CustomerBanks 的类型,ArrayList?
建议用Set,引用Iesi.Collections
具体可以查看我的Blog

#3楼    回复  引用    

2005-05-31 11:32 by donaldxu [未注册用户]
Nhibernate 也采用Iesi,来实现JAVA的Set对象。

#4楼 [楼主]   回复  引用  查看    

2005-05-31 11:49 by 柚子Nan      
好的,谢谢3位,我试试看!这样可以?
public IList CustomerBanks
{
get{return custumerBanks;}
set{custumerBanks = value;}
}
public Customer()
{
custumerBanks = new ArrayList();
}

#5楼 [楼主]   回复  引用  查看    

2005-05-31 12:01 by 柚子Nan      
虽然还是报错,但是我看到SQL语句了,
大概就是这个意思
INSERT INTO Customer (CustomerAge, CustomerTitle, updatetimestamp)
VALUES (25, 'Developer', 'May 31 2005 11:42:37:050AM')

UPDATE Bank
SET CustomerID = 8,
BankName = 'CICB' ,
Banlance = 1233453.23400,
updatetimestamp ='May 31 2005 11:42:37:097AM'
BankID = @p4 AND updatetimestamp = 'May 31 2005 11:42:37:097AM'

怎么没有Insert Bank ? 我想在这里也插入Bank啊,怎么弄?
要手工写 aEntityRule.Save(aBank);这个吗?

#6楼 [楼主]   回复  引用  查看    

2005-05-31 12:04 by 柚子Nan      
@donaldxu :
你的BLog不能访问

#7楼    回复  引用  查看    

2005-05-31 14:23 by 小草      
public Customer()
{
}
private IDictionary custumerBanks= new Hashtable();
public IDictionary CustomerBanks
{
get { return custumerBanks; }
set { custumerBanks= value; }
}

不用写aEntityRule.Save(aBank);
试试
aCustomer.CustomerBanks.Add(aBank, aBank);


aEntityRule.Save(aCustomer);就已经将父表子表保存了

xml文件我是用的set
inverse为true

#8楼    回复  引用  查看    

2005-05-31 14:24 by Yok      
Bank的id没设unsave-value

#9楼    回复  引用  查看    

2005-05-31 14:33 by Yok      
@小草:
你是不是好久没搞nhibernate了, 还是0.6以前的版本, 用IDictionary来代替Set -_-

#10楼    回复  引用  查看    

2005-05-31 21:33 by 小草      
汗一个,是很久没搞,快半年了!^_^

#11楼 [楼主]   回复  引用  查看    

2005-06-01 10:20 by 柚子Nan      
<set name="CustomerBanks"
cascade="all"
order-by="BankName asc"
inverse="true">
<key column="CustomerID" />
<one-to-many class="Data.Bank, Data"/>
</set>
改成这样,竟然还是报错,这个时候我开始怀疑,我的这个需求过分吗?
错误如下:Specified cast is not valid.
Stack 中的错误at NHibernate.Impl.SessionImpl.SaveWithGeneratedIdentifier(Object obj, CascadingAction action, Object anything)
看来是我的ID生成策略的问题?

#12楼 [楼主]   回复  引用  查看    

2005-06-01 11:23 by 柚子Nan      
找到问题了,终于还是在堆栈中发现的
The type NHibernate.Collection.Set can not be assigned to a property of type IDictionary setter of Data.Customer.CustomerBanks

然后我把这个数据类型修改为:
private Iesi.Collections.ISet custumerBanks;
custumerBanks = new Iesi.Collections.HashedSet();
就OK了,庆祝一下!郁闷了3天的东西了!

#13楼    回复  引用    

2005-10-08 14:14 by sea [未注册用户]
我也碰到你的问题,但是我们的应用程序可能使用IList接口,怎么直接返回IList接口的数据呢?我想不到好的办法.

#14楼    回复  引用    

2008-05-26 21:29 by gamerggg [未注册用户]
We provide the following cheap gold :
<a herf="http://www.docoin.com/cheap.EVE_Online.1.aspx">eve isk</a>
<a herf="http://www.docoin.com/cheap.EVE_Online.1.aspx">cheap eve isk</a>
<a herf="http://www.docoin.com/cheap.EVE_Online.1.aspx">eve online isk</a>
<a herf="http://www.docoin.com/cheap.EVE_Online.1.aspx">cheap eve online isk</a>
<a herf="http://www.docoin.com/cheap.Lineage_2.4.aspx">L2 adena</a>

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接:

历史上的今天:
2004-05-31 垃圾收集学习笔记(第2章)