博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NHibernate 联合主键(composite-id)
阅读量:6656 次
发布时间:2019-06-25

本文共 3187 字,大约阅读时间需要 10 分钟。

转载地址:

概览

这个系列是以博客形式整理关于NHibernate的Issues。记录一些零碎的小例子,通过零零碎碎的整理,可以巩固自己的知识和扩展我们的知识面。这些小例子也可以适当的在项目中呈现。

这次看看联合主键(composite-id)。

实例

有时建模需要,需要把几个属性组合了一个标识符,就用到了联合主键(composite-id),我们使用它,就难免遇到了一些问题,比如如何映射,如何等同性比较,如何查询等操作。

1.Domain

这里定义一个Domain——CustomerValue,这个持久化类有两个属性:联合主键(composite-id)和Value。

我们使用联合主键,首先需要定义联合主键的类型,同时这个类必须重载Equals()和GetHashCode()方法,来实现组合的标识符等同性判断。 例如下面的CustomerValue持久化类,其联合主键类型为CustomerValueId,就是Customer持久化类与int类型的复合形式,在CustomerValueId类中重载了Equals()和GetHashCode()方法。

public class Customer{    public virtual int Id { get; set; }    public virtual string Name { get; set; }}public class CustomerValue{    public virtual CustomerValueId Id { get; set; }    public virtual decimal Value { get; set; }}public class CustomerValueId : IEquatable
{ private int? _requestedHashCode; public Customer Customer { get; set; } public int CustomKey { get; set; } public bool Equals(CustomerValueId other) { if (ReferenceEquals(null, other)) { return false; } if (ReferenceEquals(this, other)) { return true; } return Equals(other.Customer, Customer) && other.CustomKey == CustomKey; } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) { return false; } if (ReferenceEquals(this, obj)) { return true; } if (obj.GetType() != typeof(CustomerValueId)) { return false; } return Equals((CustomerValueId)obj); } public override int GetHashCode() { if (!_requestedHashCode.HasValue) { unchecked { _requestedHashCode = ((Customer != null ? Customer.GetHashCode() : base.GetHashCode()) * 397) ^ CustomKey; } } return _requestedHashCode.Value; }}

2.Mapping

需要对两个Domain映射,这里注重理解下联合主键的映射,这里是把类的Customer属性和CustomerKey属性组合成为标识符属性。<key-many-to-one>节点用于映射子元素,一般都是Domain(多对一关系的);<key-property>节点用于映射属性。在这里我需要在<key-many-to-one>节点中设置not-found attribute来避免在运行时抛出异常,就是设置not-found="ignore"。

3.Test

做完了上面的步骤,测试一下,保存一个CustomerValue。查询验证下并删除。这个测试很简单,就不贴出SQL结果了。

using (var session = OpenSession()){    using (var tx = session.BeginTransaction())    {        var customer = new Customer { Name = "李永京" };        session.Save(customer);        var customerValue = new CustomerValue                                {                                    Id = new CustomerValueId { Customer = customer, CustomKey = 20012 },                                    Value = 1255.0m                                };        session.Save(customerValue);        tx.Commit();    }    using (var tx = session.BeginTransaction())    {        var customerValue = session.CreateQuery("from CustomerValue c where c.Value=:value")            .SetDecimal("value", 1255.0m)            .UniqueResult
(); session.Delete(customerValue); session.Delete("from Customer"); tx.Commit(); }}

转载于:https://www.cnblogs.com/smthts/archive/2012/09/04/2670223.html

你可能感兴趣的文章
segmentController
查看>>
淘宝初始化代码 - 解决浏览器的兼容问题
查看>>
在win8 64位操作系统下Power Designer 16.5对MySQL5.6逆向工程的配置详解
查看>>
07.Javascript——入门高阶函数
查看>>
LeetCode – Refresh – Remove Duplicates from Sorted Array
查看>>
centos 7 中没有iptables 和service iptables save 指令使用失败问题解决方案
查看>>
R语言数据可视化1—ggplot2画柱状图
查看>>
Ubuntu安装微信开发者工具
查看>>
Windows 7 MVC2.0部署到IIS7【原创】
查看>>
C#属性和成员变量的区别?
查看>>
ps引发的血案
查看>>
HDU Problem 1312 Red and Black 【DFS】
查看>>
class.py
查看>>
关于DIPS的DLL注入(第22章)
查看>>
windows网络模型之重叠IO(完成例程)的使用
查看>>
C++中的RAII(转)
查看>>
POJ 1733 Parity game
查看>>
一步一步学Entity Framework 4(2)
查看>>
web站点,同一个浏览器只能登陆一个用户的原因(cookie不能跨浏览器)
查看>>
linux 部署 webservice
查看>>