public virtual bool Equals(BaseEntity 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;
 }
 private static bool IsTransient(BaseEntity obj)
 {
     return obj != null && Equals(obj.Id, default(int));
 }