2

equals と GetHashcode をオーバーライドした抽象基本エンティティ クラスを実装しようとしています...これが私のエンティティ基本クラスです

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();
}

}

エンティティ ベース Id の値はどのように割り当てられますか?

私のクラスの主キーには異なるデータ型があり、名前もクラスごとに異なります。これが私のクラスのサンプルです:

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 プロパティを設定する方法について少し混乱しています。誰でもこれについて私に提案してもらえますか、助けていただければ幸いです。

4

1 に答える 1

3

継承された基本クラスに型を渡すだけです。

エンティティのコメントを参照してください:

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 プロパティのデータベース列を指定するだけです。

于 2012-08-03T05:51:24.033 に答える