Nhibernate 多对多级联更新
问题是这样的,有两个表:文章(Article)和分类(Lable),这两者之间的关系是多对多关联,如果你用Nhibernate来保存数据的话非常的好操作,新建Article,然后把Lable值赋值给Article的Lables(这个是在Article类里面有定义的),像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace MyMvc4Project.Models
{
/// <summary>
/// t_Article:实体类(属性说明自动提取数据库字段的描述信息)
/// </summary>
[Serializable]
public class Article
{
/// <summary>
/// id
/// </summary>
public string Id { get; set; } /// <summary>
/// 标题
/// </summary>
public string Title { get; set; } /// <summary>
/// 内容
/// </summary>
public string Contents { get; set; } /// <summary>
/// 点击浏览次数
/// </summary>
public int ClickCount { get; set; } /// <summary>
/// 创建时间
/// </summary>
public DateTime? CreateTime { get; set; } /// <summary>
/// 更新时间
/// </summary>
public DateTime? UpdateTime { get; set; } public IList<Lable> Lables { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace MyMvc4Project.Models
{
/// <summary>
/// t_Lable:实体类(属性说明自动提取数据库字段的描述信息)
/// </summary>
[Serializable]
public class Lable
{
/// <summary>
/// id
/// </summary>
public string Id { get; set; } /// <summary>
/// 标签名
/// </summary>
public string Name { get; set; } /// <summary>
/// 显示等级
/// </summary>
public int Level { get; set; } /// <summary>
/// 创建时间
/// </summary>
public DateTime? CreateTime { get; set; } /// <summary>
/// 文章
/// </summary>
public IList<Article> Articles { get; set; }
}
}
上面定义的是文章类和分类类别类,现在要保存文章数据,像这样:
Article article =new Article() article.Id=Guid.NewGuid().toString(); article.Title=title; article.Contents=contents; article.CreateTime=DateTime.Now(); article.UpdateTime=DateTime.Now(); article.Lables=lableList; _session.Save(article);
这样的保存好操作,但是我在级联更新的时候遇到问题了,在网上搜索了一下,好像国内使用Nhibernate的人特别少,资料也很少,好像在博客园里Nhibernate比较专业一点的就只有李永京的博客了,不过我没有找到关于级联更新的文章,非常的遗憾。于是我又在官网上查找Nhibernate级联的资料,于是我按照官网上的资料这样操作:
public void Update(Article bean)
{
//这行代码非常的重要,对于nhibernate多对多级联更新
var article = (Article)_session.Load(typeof(Article), bean.Id); var lblList = bean.Lables.Select(
lable => (Lable) _session.Load(typeof (Lable), lable.Id)
).ToList(); article.User = bean.User;
article.Title = bean.Title;
article.Contents = bean.Contents;
article.UpdateTime = DateTime.Now;
article.Lables = lblList;
try
{
_session.Update(article);
_session.Flush();
}
catch (Exception)
{
throw;
}
}
分析:
官网的思路是这样的,先用
var article = (Article)_session.Load(typeof(Article), bean.Id);
通过文章id获取到文章数据,然后再赋值更新,而且所关联的分类数据(Lable)也是这样操作的(先获取后更新),我不知道这样做是不是正确的,也希望博客园里的专家看了我的文章后提出自己的意见或建议,这样我才知道我这样做是不是很完美。
我还在想一个问题,如果所关联的数据有千万条的话,这样关联的更新是不是影响性能?唉,对Nhibernate存在着无数的问题。
Nhibernate 多对多级联更新的更多相关文章
- Nhibernate 多对多级联删除
在网上找到的方法:查看这里 //-------------------------------------Article.hbm.xml-------------------------------- ...
- 【Python】Django数据模型、级联删除、级联更新、ER图导出等
在本文中,我们将向读者详细介绍如何在更新和删除父表数据的同时,触发有关子表数据的级联更新和删除操作.您将看到当使用InnoDB表的时候,借助于外键约束就可以轻松搞定这一过程. 一.利用外键约束更新并删 ...
- 自增特性,外键,级联更新与级联删除,表间关系,SELECT用法,GROUP BY
自增特性 自动增长的作用: 问题:为数据表设置主键约束后,每次插入记录时,如果插入的值已经存在,会插入失败. 如何解决:为主键生成自动增长的值. 自动增长的语法: 字段名 数据类型 AUTO_INCR ...
- SQL图形化操作设置级联更新和删除
SQL级联操作设置 对SQL数据库的表,进行级联操作(如级联更新及删除),首先需要设置表的主外键关系,有两种方法: 第一种: 1. 选择你要进行操作的数据库 2. 为你要创建关系的两个 ...
- mysql级联更新
MySQL 各种级联查询后更新(update select). CREATE TABLE `tb1` ( `id` int(11) NOT NULL, `A` varchar(100) defa ...
- JPA oneToMany 级联更新
oneToMany 使用: 示例:Employee与Phone为例. 1.类定义如下: package com.vrvwh.wh01.domain; import javax.persistence. ...
- 整理sqlserver 级联更新和删除 c#调用存储过程返回值
整理一下级联更新和删除 c#调用返回值 use master go IF exists(select 1 from sysdatabases where name='temp') BEGIN DROP ...
- mysql级联更新的两种方式:触发器更新和外键
1.mysql级联更新有两种方式:触发器更新和外键更新. 2.触发器更新和外键更新的目的都是为了保证数据完整性. 我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1 ...
- oracle系列--级联删除和级联更新
必须声明:此博客转载于Oracle外键级联删除和级联更新http://www.2cto.com/database/201507/417496.html 鉴于此前收藏的精彩博客无料被删除了,很是痛心,所 ...
随机推荐
- 【策略】UVa 1344 - Tian Ji -- The Horse Racing(田忌赛马)
Here is a famous story in Chinese history. That was about 2300 years ago. General Tian Ji was a high ...
- 【转】ora-00031:session marked for kill(标记要终止的会话)解决方法
今天碰到一个问题,有一张表不能操作,很可能是被锁了,首先想到的是kill session,于是执行了下列的脚本找到是哪个session有问题: select object_name, machine, ...
- saltstack实战3--配置管理之pillar
数据系统-Pillar pillar和grains类似,但是它能给minion指定它想要的数据,安全性较好,另外它是在master端设置的 应用场景: grains的特性–每次启动汇报.静态决定了 ...
- unity3d游戏无法部署到windows phone8手机上的解决方法
今天搞了个unity3d游戏,准备部署到自己的lumia 920上,数据线连接正常,操作正常,但是“build”以后,始终无法部署到手机上,也没有在选择的目录下生产任何相关文件.(你的系统必须是win ...
- VSFTPD无法上传的解决方法
搭建好FTP之后就没有去测试了,今天去试了一下上传的时候发生错误了,无法上传,提示“553 Could not create file”错误, 上网找了一些资料,发现很多都说是权限和防火墙的问题,但是 ...
- JQuery Mobile页面加载处理
在弄移动Web时采用了JQueryMobile框架. 奇怪的是 在使用页面加载 时 事件无效 我尝试了两种方法: $(document).ready(function(){ //do events } ...
- JS调用iframe方式实现Web区域打印页面内容
1.程序说明 1) 此程序可以实现选择页面中的区域进行打印,以iframe方式进行打印: 2) 与原生态的print() 区别在于,取消打印页面后可以完整保留当前访问页面的内容. 2.代码部分 1) ...
- js 获取 当前时间 时间差 时间戳 倒计时
开发web一段时间后发现经常使用时间进行一些操作,比较多的就是获取当前时间.对时间进行比较.时间倒计时.时间戳这些部分,每次去用经常忘总是需要去查询,还是自己总结一下比较靠谱. 获取时间戳的方法: 第 ...
- [zz] pgpool-II load balancing from FAQ
It seems my pgpool-II does not do load balancing. Why? First of all, pgpool-II' load balancing is &q ...
- Bootstrap学习笔记(一) 排版
Bootsrap是一款优秀的前端开发框架,我从慕课网上开始学习Bootstrap,以下我学习过程中的一些笔记及代码. 首先学习排版: 从Bootstrap网站下载Bootstrap3中文文档(V3.3 ...