2012-08-02 66 views
1

我想实现已经重写平等和GetHashCode抽象基实体类...这里是我的实体基类NHibernate和实体基类

public abstract class Entity<TId> 
{ 

public virtual TId Id { get; protected set; } 
protected virtual int Version { get; 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(); 
} 

}

如何实体的值基地标识被分配?

我的类的主键具有不同的数据类型,每个类的名称也不同。 这里是我的课的样本:

public class Product : Entity 
{ 
    public virtual Guid ProductId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual Decimal UnitPrice { get; set; } 
} 

public class Customer : Entity 
{ 
    public virtual int CustomerID { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual int Age { get; set; } 
} 

我是如何设置的基类的ID属性有点糊涂了。任何人都可以请建议我,我会很感激任何帮助。

回答

2

你只需要传递一个类型到继承的基类。

看评论中的实体:

public class Product : Entity<Guid> 
{ 
    // The ProductId property is no longer needed as the 
    // Id property on the base class will be of type Guid 
    // and can serve as the Id 
    //public virtual Guid ProductId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual Decimal UnitPrice { get; set; } 
} 

public class Customer : Entity<int> 
{ 
    // The CustomerID property is no longer needed as the 
    // Id property on the base class will be of type int 
    // and can serve as the Id 
    // public virtual int CustomerID { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual int Age { get; set; } 
} 

现在,在您的NHibernate映射文件,只需指定数据库列是什么您的ID属性。