Nhib映射添加

本文详细解释了在NHibernate环境中,如何通过一对一映射关系,将Order对象与Customer对象关联,并正确地在数据库中插入Order对象。包括了在类中设置Customer对象的方式、如何避免数据一致性问题以及实现级联操作的方法。

关于(李永京)NHibernate一对多映射的关系中对象的添加

1
悬赏园豆:100 [已解决问题] 浏览: 1346次
在学了了李永京组长的NHibernate 的教程后,有个地方弄不太明白。想请大家多多帮忙下。
 
   
比如当Order.cs类定义为以下内容后,
namespace DomainModel.Entities
{  
   public class Order   
  {       
     public virtual int OrderId { get; set; }   
     public virtual DateTime OrderDate { get; set; }  
      //多对一关系:Orders属于一个Customer     
     public virtual Customer Customer { get; set; }  
  }
}
 
   
现在要往数据库中插入一个Order对象。要如何插入呢?
上面的Customer是类对象类型。数据库中对应的Customer是int类型 。
然后添加对象的时候:
session.Save(new Order(){OrderDate=xx,Customer=??});
session.Flush();
当中的Customer应该怎么赋值呢?
林鑫的主页 林鑫 | 初学一级 | 园豆: 100
提问于:2010-02-04 13:01
其他回答(3)
1

晕,Order中的Customer只是个外键

一般不建议在类中设置双向关联的,不好控制

你可以去掉这个属性,在Customer类中AddOrder来增加Order。

或者Order.Customer=某个Customer对象

李永京 | 园豆:3004 (老鸟四级) | 2010-02-04 22:26
永京,你好啊,我有点不太明白. 比如:Customer与Order吧如果要做关系,一般在Customer还是在Order做,或者两者都做呢?关系怎样做,要级联删除不? 如是我现在删除Customer对象是不是Customer下所有Order都全部删除呢?
天水三千 | 园豆:200 (初学一级) | 2011-04-01 21:50
0

在配置的时候有个Inverse属性用来控制由父亲或儿子来维护级联关系,false的时候就是父亲(Customer)来维护,ture则是儿子(Order)。
如果是父亲的话:
customer.orders.add(new order(id="xx"));
session.Save(customer);

如果是儿子就是按照你写的那样,Customer应该是一个Customer对象,而不是int类型。

LeoXing | 园豆:258 (菜鸟二级) | 2010-02-04 13:48
你好。首先很感谢兄台的相助。还有个问题还是不太清楚,想问下兄台。就是如果是父亲来维护的话,上面的customer.orders.add中customer 是怎么得来的呢?是新创建的一个实例还是从数据库中查询出已经存在的实例呢?还有,如果是儿子来维护的话,那那个customer对象又是怎么创建呢?
林鑫 | 园豆:100 (初学一级) | 2010-02-04 20:43
0

public virtual int OrderId { get; set; }  

     public virtual DateTime OrderDate { get; set; }  
 
     
这两个就ok了,应该还有一个customerid,是int的
 
     
对象是方便你访问的时候用的,
Virus-BeautyCode | 园豆:1565 (小虾三级) | 2010-02-04 14:03
你好。谢谢兄台的回答。如果只定义上面两个的话,好像没有办法添加进相应的customerid的。
林鑫 | 园豆:100 (初学一级) | 2010-02-04 20:44
0

老实说,我不精通 nh,但最近一直在用。这种关系我这边常接触到。一般我的处理流程是:

//第一步、必须确保外键(int, CustomerId/Customer.Id)存在,否则两种情况:要么数据库数据不完整,要么 nh 映射报错(找不到该 Customer)。

Customer existCustomer = new Customer() { ...  };

existCustomer = (Customer)session.Insert(target);

session.flush();//?

//第二步,进行关联,保存当前目标实体

session.Insert(new Order(){OrderDate=xx,Customer= existCustomer });
session.Flush();//?
陛下ifengsao | 园豆:3938 (老鸟四级) | 2010-02-04 17:47
你好。谢谢兄台的热心帮助。这里还有点疑惑请教下。按上面的步骤来添加记录的话,好像只有在每次创建一个新的Customer实体的时候才能添加Order记录是吗?我今天尝试了很多方法来创建,假设知道当前CustomerId,要为该Customer添加相应的Order记录。我的作法是:先根据Customer中的CustomerId,查询出这个Customer实例,然后用这个Customer实例来初始化Order.即:Customer c=session.Get<Customer>(id); session.Save(new Order(){OrderDate=xx,Customer=c}); session.Flush(); 这样来做。但是老觉得这样有点别扭。难道插入一条Order前要先查询一次Customer记录用于进行关联?我刚接触这东西。可能理解上有误差。请兄台指教。
林鑫 | 园豆:100 (初学一级) | 2010-02-04 21:00
@林鑫:是这样的,想要插入order的话必须得先得到customer。
LeoXing | 园豆:258 (菜鸟二级) | 2010-02-05 08:20
@LeoXing: 这样不是别扭,使用orm就是为了这样啊。虽然可能繁琐些,但扩展性确实好一点,更符合 oo 思想。
陛下ifengsao | 园豆:3938 (老鸟四级) | 2010-02-05 12:59
基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕基于序贯蒙特卡洛模拟法的配电网可靠性评估展开研究,重点介绍了利用Matlab代码实现该方法的技术路径。文中详细阐述了序贯蒙特卡洛模拟的基本原理及其在配电网可靠性分析中的应用,包括系统状态抽样、时序模拟、故障判断与修复过程等核心环节。通过构建典型配电网模型,结合元件故障率、修复时间等参数进行大量仿真,获取系统可靠性指标如停电频率、停电持续时间等,进而评估不同运行条件或规划方案下的配电网可靠性水平。研究还可能涉及对含分布式电源、储能等新型元件的复杂配电网的适应性分析,展示了该方法在现代电力系统评估中的实用性与扩展性。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及从事电网规划与运行的技术工程师。; 使用场景及目标:①用于教学与科研中理解蒙特卡洛模拟在电力系统可靠性评估中的具体实现;②为实际配电网的可靠性优化设计、设备配置与运维策略制定提供仿真工具支持;③支撑学术论文复现与算法改进研究; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法流程,重点关注状态转移逻辑与时间序列模拟的实现细节,并尝试在IEEE标准测试系统上进行验证与扩展实验,以深化对方法机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值