问题是这样的,有两个表:文章(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 多对多级联更新的更多相关文章

  1. Nhibernate 多对多级联删除

    在网上找到的方法:查看这里 //-------------------------------------Article.hbm.xml-------------------------------- ...

  2. 【Python】Django数据模型、级联删除、级联更新、ER图导出等

    在本文中,我们将向读者详细介绍如何在更新和删除父表数据的同时,触发有关子表数据的级联更新和删除操作.您将看到当使用InnoDB表的时候,借助于外键约束就可以轻松搞定这一过程. 一.利用外键约束更新并删 ...

  3. 自增特性,外键,级联更新与级联删除,表间关系,SELECT用法,GROUP BY

    自增特性 自动增长的作用: 问题:为数据表设置主键约束后,每次插入记录时,如果插入的值已经存在,会插入失败. 如何解决:为主键生成自动增长的值. 自动增长的语法: 字段名 数据类型 AUTO_INCR ...

  4. SQL图形化操作设置级联更新和删除

    SQL级联操作设置   对SQL数据库的表,进行级联操作(如级联更新及删除),首先需要设置表的主外键关系,有两种方法:   第一种:   1. 选择你要进行操作的数据库   2. 为你要创建关系的两个 ...

  5. mysql级联更新

    MySQL  各种级联查询后更新(update select). CREATE TABLE `tb1` (  `id` int(11) NOT NULL,  `A` varchar(100) defa ...

  6. JPA oneToMany 级联更新

    oneToMany 使用: 示例:Employee与Phone为例. 1.类定义如下: package com.vrvwh.wh01.domain; import javax.persistence. ...

  7. 整理sqlserver 级联更新和删除 c#调用存储过程返回值

    整理一下级联更新和删除 c#调用返回值 use master go IF exists(select 1 from sysdatabases where name='temp') BEGIN DROP ...

  8. mysql级联更新的两种方式:触发器更新和外键

    1.mysql级联更新有两种方式:触发器更新和外键更新. 2.触发器更新和外键更新的目的都是为了保证数据完整性. 我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1 ...

  9. oracle系列--级联删除和级联更新

    必须声明:此博客转载于Oracle外键级联删除和级联更新http://www.2cto.com/database/201507/417496.html 鉴于此前收藏的精彩博客无料被删除了,很是痛心,所 ...

随机推荐

  1. poj 2057 树形dp 贪心

    思路:设sum[i],le[i],back[i],worm[i]分别表示以i为根节点需要的完成步数,叶子节点数,失败回退步数,以及i是否有虫. #include<iostream> #in ...

  2. mdeditor

    *在线地址:* http://ghosertblog.github.io/mdeditor/ # Markdown 语法简明手册 ### 1. 使用 * 和 ** 表示斜体和粗体 示例: 这是 *斜体 ...

  3. Jersey(1.19.1) - Client API, Uniform Interface Constraint

    The Jersey client API is a high-level Java based API for interoperating with RESTful Web services. I ...

  4. MongoDB - Installing MongoDB on Linux

    1. 下载最新稳定版本的安装包. [huey@huey mongodb]$ wget -c --no-check-certificate https://fossies.org/linux/misc/ ...

  5. android doc 本地文档加载慢的解决办法

    从来都是FQ上谷歌官网查文档,但是有时没办法FQ,就得用sdk本地的doc文档了,由于文档内部的一些javascript,font等也需要访问Google来加载,导致了打开本地网页也巨慢无比,甚至转了 ...

  6. Android 第三方授权(微信篇)

    0.申请开发者: https://open.weixin.qq.com/cgi-bin/frame?t=home/app_tmpl&lang=zh_CN 1.下载sdk包: https://o ...

  7. sql中的触发器、视图、事务

    ·触发器(trigger) [触发器本质上还是一个存储过程,只不过不是用exe来调用执行,而是通过增删改数据库的操作] [触发器只对增.删.改有效] 触发器的格式 (instead of与for的区别 ...

  8. 关于iOS9中配置App Transport Security(应用程序传输安全协议)

    在 在info.plist中,进行上面的配置就行了,注意的是,那个网址,你需要访问什么网址,就填写什么网址就行了. NSTemporaryExceptionAllowsInsecureHTTPLoad ...

  9. windows 7 64 bit 使用 virtual box 的经验

    本人电脑是联想thinkpad E535的机子,安装的是64bitwindows7 旗舰版 为了更好的工作,我安装了虚拟机virtualbox最新版 很不幸,我出现了多次蓝屏的情况,我换到32位系统下 ...

  10. 【译】 Node.js v0.12的新特性 -- Cluster模式采用Round-Robin负载均衡

    原文:https://strongloop.com/strongblog/whats-new-in-node-js-v0-12-cluster-round-robin-load-balancing 本 ...