NHibernate Cookbook 学习笔记 4 Setting up a base entity class

1.如何设置所有实体的基本类:先看下面的代码

namespace NStudy.core {
    public abstract class Entity<TId> {
        public virtual TId Id { get; protected set; }
        public override bool Equals(object obj) {
            return Equals(obj as Entity<TId>);
        }
        private static bool IsTransient(Entity<TId> obj) {
            return obj != null &&
                   Equals(obj.Id, default(TId));
        }
        private Type GetUnproxiedType() {
            return GetType();
        }
        public virtual bool Equals(Entity<TId> other) {
            if (other == null)
                return false;
            if (ReferenceEquals(this, other))
                return true;
            if (!IsTransient(this) &&
                !IsTransient(other) &&
                Equals(Id, other.Id)) {
                var otherType = other.GetUnproxiedType();
                var thisType = GetUnproxiedType();
                return thisType.IsAssignableFrom(otherType) ||
                       otherType.IsAssignableFrom(thisType);
            }
            return false;
        }
        public override int GetHashCode() {
            if (Equals(Id, default(TId)))
                return base.GetHashCode();
            return Id.GetHashCode();
        }
    }
}


2.在当前的文件中再加一个类:

public abstract class Entity : Entity<Guid> {

    }


 

先看看Equals方法:

1.other为空的话,就不用比较了,直接返回不相等的结果。

2.ReferenceEquals(this,other)2个引用都是同一个对象更不用说了,返回相等。

3.IsTransient(Entity<TId>obj)用来查看对象是不是不需要持久化到数据库中的对象,不需要持久化到数据库中的对象,不做考虑,直接返回不相等了。

4. Equals(Id,other.Id)值类型直接返回值的比较结果。这个要相等先

5.GetUnproxiedType()返回当前类的类型,不会返回代理类的类型(ProductProxy12398712938之类的类型)。保证thisType.IsAssignableFrom(otherType)otherType.IsAssignableFrom(thisType)所得到到类型是基本类型,而不是代理类型。

实际上是访问几倍的gettype这个是穿过一层的关系访问基类????

 

然后的话就是添加gethash方法了,这个实现了equel方法的类必须实现的方法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值