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 鉴于此前收藏的精彩博客无料被删除了,很是痛心,所 ...
随机推荐
- nginx实现域名重定向
一般网站默认的访问端口为80,当多个域名指向同一个服务器IP时,可以nginx进行重定向,分别指向不同的目的地址或其他主机. 在nginx目录下的conf/vhost子目录下建两个conf文件,hos ...
- BZOJ 2763
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2073 Solved: 790[Submit][Statu ...
- AngularJS 整理资料
AngularJS是Google开源的一款JavaScript MVC框架,弥补了HTML在构建应用方面的不足,其通过使用指令(directives)结构来扩展HTML词汇,使开发者可以使用HTML来 ...
- Git CMD - tag: Create, list, delete or verify a tag object signed with GPG
命令格式 git tag [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] <tagname> [& ...
- CSS之照片翻转
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- Libcurl笔记二
一: multi与easy接口的不同处The multi interface offers several abilities that the easy interface doesn't. The ...
- Qt自定义菜单项
经常会看到一些菜单的部分项是由几个按钮组成的,如酷狗.QQ.360都有类似菜单,对于常规的菜单项,图标 + 文字 实现一个事件,很容易完成,那么怎么自定义菜单项呢? Qt提供了支持,就是利用QWidg ...
- SQL 远程过程调用失败【0x800706be】或正在关闭 【0x80041033】解决方法
在SQL Server 配置管理器中出现[远程过程调用失败.[0x800706be]]或者[正在关闭 [0x80041033]]错误,如图所示 上网查找发现时SQL2008与VS2012或VS2013 ...
- Percona-Server-5.5.33-31.1安装
一.下载 http://www.percona.com/downloads/Percona-Server-5.5/ Percona-Server-5.5.33-31.1 选择 binary 选择lin ...
- Easyui 生成layout
Easyui 生成layout var $tabs; var $body; var $south; function appendLayout(title, href) { if (!$body) $ ...