>source

NHibernate 3.0 요리 책에서 기본 엔티티 유형에 대한 샘플 구현이 있습니다. equals는 다음과 같이 구현됩니다.

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 &amp;
&amp;
 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) &amp;
&amp;
 !IsTransient(this) &amp;
&amp;
 Equals(Id, other.Id))
    {
      var otherType= other.GetUnproxiedType();
      var thisType= GetUnproxiedType();
      return thisType.IsAssignableFrom(otherType) ||
         otherType.IsAssignableFrom(thisType);
    }
    return false;
  }
}

getUnproxiedType () 메서드의 이유는 다음과 같습니다. 추상 기본 클래스 제품, 제품을 상속받은 콘크리트 클래스 책 및 Nhibernate가 게으른 하중을 위해 사용되는 동적 프록시 클래스 ProductProxy. 책을 나타내는 ProductProxy와 Concrete Book에는 동일한 ID가 있으면 동일하게 처리해야합니다. 그러나 ProductProxy 인스턴스에서 getType () 호출 이이 경우 제품을 반환 해야하는 이유와 도움이되는 이유를 알 수 없습니다. 어떤 아이디어가 있습니까?

'getType ()'메소드 구현을 첨부 할 수 있습니까? 그것을 보지 않고, "콘크리트"의 기본 수업을 반환한다는 것을 추측합니다 (예 : ProductProxy의 경우 제품을 반환해야합니다 '

J. Ed2021-09-04 07:54:20

ProductProxy는 Nhibernate에서 생성 한 동적 프록시 클래스이므로 구현에 대해 전혀 모르겠습니다. 나는 니시가 프록시가 어떻게 도움이 될지를 도울 수있는 방법에 대한 통찰력을 가진 사람이었을 것입니다. 또한 getType ()은 가상이 아닙니다. 프록시 클래스에서 "new"로 구현하는 것은 전혀 효과가 없을 것입니다 ..

Can Gencer2021-09-04 07:54:20

나는 같은 책을 가지고 있으며 나는 equals 구현의 큰 팬이 아닙니다. 그것은 물체의 지속성에 너무 많이 의존합니다. 이 책은 엔티티 중 하나가 일시적이지 않으면 (DB에 저장되지 않음)이 동일은 항상 false를 반환합니다. 첫째, 이것은 이것이 이것이 데이터베이스에 저장하기 전에 평등을 검사하기를 원한다면 이것이 지속성 무지 규칙을 깰 것이고 두 번째로 믿는 것이 믿습니다. 나는 효율성을 위해이 부분을 구현합니다 (IDS 확인)에서는 여전히 모든 내 객체에 대해 "논리적"과 동일합니다.

brainimus2021-09-04 07:54:20
  • 답변 # 1

    현재 (V5.x) NHibernate 프록시 공장 (정적 또는 동적, V5.1 이후의 정적 가능)이 패턴은 실제로 깨졌습니다. V5 내장 프록시 공장은 개인 메소드를 가로 챌 수 없습니다.

    그리고 나는 그것이 이미 v4의 사건이었습니다.

    이 패턴의 현재 내장 프록시 공장에서 작동하려면,getUnproxiedType.해야한다가상(그렇게하지 마라사적인그건 그렇고,하지만보호 된 것입니다짐마자

    그렇지 않으면 사용합니다nhibernateutil.getclass.getclass.getclass.이것은 이것을 의미하고 취성적인 속임수에 의존하지 않습니다. 그 설명서는 부작용으로 프록시를 초기화 할 것이지만 어쨌든getUnproxiedType.트릭은 일하러 똑같이해야합니다.

    물론 사용nhibernateutil.getclass.getclass.getclass.도메인 모델 기본 클래스에서 NHibernate에 대한 직접적인 종속성을 갖는 것을 의미합니다. 그러나 외부 (도메인 시점에서) 라이브러리 구현에 특정한 구현 트릭에 따라 내 의견으로는 더 좋지 않습니다.

    더욱이 몇 가지 변화가 발생할 수 있습니다.getUnproxiedType.미래에 더욱 깨질 수있는 트릭은 프록시가 피할 수있을 때 프록시가 초기화 될 수있는 사례 수를 줄이는 몇 가지 아이디어와 마찬가지로입니다. (보다 여기예제로.)

    정말로 원한다면getUnproxiedType.방법은 직접적인 nhibernate 참조에 따라, 나는 이론적으로 "안전한"솔루션만이 각 구체적인 엔티티 클래스에서 추상화하고 무시하는 것입니다.TypeOf (incleentityclass)...에 그러나 실제로는 성가신 및 오류가 발생하기 쉬운 (새로운 엔티티를 만들기위한 나쁜 복사 -붙여 넣기, 그 방법을 변경하는 것의 ...)을 잊어 버릴 것입니다. 일부 구체적인 엔티티 클래스가 더 전문화되어있는 경우 추상 부분이 도움이되지 않습니다. 상속을 통해.

    다른 트릭은GetType.또한 도메인 모델 어셈블리 (IES)에 속한 계층 구조의 첫 번째 유형을 검색하는 데 속한 어셈블리 (프록시 유형가 선택되지 않음)를 확인합니다.
    프록시가 구체적인 클래스가 아닌 기본 클래스의 프록시이고 헬퍼 메소드가 비공개로 설정되면 프록시를 초기화하지 않고 기본 클래스 유형을 생성합니다. 성능 현명, 이것은 더 좋습니다. 가상getUnproxiedType.단순히 돌아 오는 것GetType.구체적인 클래스 유형을 현재 프록시 공장으로 반환하지만 프록시를 초기화합니다.

    이것은 정말로 심각한 upvotes를 가질 자격이 있습니다. Nhibernateutil.getClass는 사용하기가 옳은 일이며, 주어진 버전의 NH가 특정 방식으로 작성하는 사실에 의존하지 않습니다.

    Jakub Januszkiewicz2021-09-04 14:37:32

    nhibernateproxyhelper.getclasswithoutinitializeproxy는 어떻습니까? 그게 더 나은 선택이 아닌가요?

    Lodewijk2021-09-04 20:08:44

    때에 따라 다르지. 일부 상속이 매핑되고 기본 클래스의 프록시가 획득되면 GetClassWithoutInitializeproxy는 구체적인 엔티티 클래스 유형이 아닌 기본 클래스 유형을 생성합니다. 응용 프로그램 요구 사항에 따라 문제가 될 수 있습니다.

    Frédéric2021-09-04 20:08:44
  • 답변 # 2

    현재 (V5.x) NHibernate 프록시 공장 (정적 또는 동적, V5.1 이후의 정적 가능)이 패턴은 실제로 깨졌습니다. V5 내장 프록시 공장은 개인 메소드를 가로 챌 수 없습니다.

    그리고 나는 그것이 이미 v4의 사건이었습니다.

    이 패턴의 현재 내장 프록시 공장에서 작동하려면,getUnproxiedType.해야한다가상(그렇게하지 마라사적인그건 그렇고,하지만보호 된 것입니다짐마자

    그렇지 않으면 사용합니다nhibernateutil.getclass.getclass.getclass.이것은 이것을 의미하고 취성적인 속임수에 의존하지 않습니다. 그 설명서는 부작용으로 프록시를 초기화 할 것이지만 어쨌든getUnproxiedType.트릭은 일하러 똑같이해야합니다.

    물론 사용nhibernateutil.getclass.getclass.getclass.도메인 모델 기본 클래스에서 NHibernate에 대한 직접적인 종속성을 갖는 것을 의미합니다. 그러나 외부 (도메인 시점에서) 라이브러리 구현에 특정한 구현 트릭에 따라 내 의견으로는 더 좋지 않습니다.

    더욱이 몇 가지 변화가 발생할 수 있습니다.getUnproxiedType.미래에 더욱 깨질 수있는 트릭은 프록시가 피할 수있을 때 프록시가 초기화 될 수있는 사례 수를 줄이는 몇 가지 아이디어와 마찬가지로입니다. (보다 여기예제로.)

    정말로 원한다면getUnproxiedType.방법은 직접적인 nhibernate 참조에 따라, 나는 이론적으로 "안전한"솔루션만이 각 구체적인 엔티티 클래스에서 추상화하고 무시하는 것입니다.TypeOf (incleentityclass)...에 그러나 실제로는 성가신 및 오류가 발생하기 쉬운 (새로운 엔티티를 만들기위한 나쁜 복사 -붙여 넣기, 그 방법을 변경하는 것의 ...)을 잊어 버릴 것입니다. 일부 구체적인 엔티티 클래스가 더 전문화되어있는 경우 추상 부분이 도움이되지 않습니다. 상속을 통해.

    다른 트릭은GetType.또한 도메인 모델 어셈블리 (IES)에 속한 계층 구조의 첫 번째 유형을 검색하는 데 속한 어셈블리 (프록시 유형가 선택되지 않음)를 확인합니다.
    프록시가 구체적인 클래스가 아닌 기본 클래스의 프록시이고 헬퍼 메소드가 비공개로 설정되면 프록시를 초기화하지 않고 기본 클래스 유형을 생성합니다. 성능 현명, 이것은 더 좋습니다. 가상getUnproxiedType.단순히 돌아 오는 것GetType.구체적인 클래스 유형을 현재 프록시 공장으로 반환하지만 프록시를 초기화합니다.

    이것은 정말로 심각한 upvotes를 가질 자격이 있습니다. Nhibernateutil.getClass는 사용하기가 옳은 일이며, 주어진 버전의 NH가 특정 방식으로 작성하는 사실에 의존하지 않습니다.

    Jakub Januszkiewicz2021-09-04 14:37:32

    nhibernateproxyhelper.getclasswithoutinitializeproxy는 어떻습니까? 그게 더 나은 선택이 아닌가요?

    Lodewijk2021-09-04 20:08:44

    때에 따라 다르지. 일부 상속이 매핑되고 기본 클래스의 프록시가 획득되면 GetClassWithoutInitializeproxy는 구체적인 엔티티 클래스 유형이 아닌 기본 클래스 유형을 생성합니다. 응용 프로그램 요구 사항에 따라 문제가 될 수 있습니다.

    Frédéric2021-09-04 20:08:44
  • 답변 # 3

    나는 실제로이 code에 대한 책의 저자에게 앞서 나갔다. 프록시 포장이 작동하는 방식 때문이는 것입니다. 그의 응답은 다음과 같습니다.

    "프록시 프레임 워크가 어떻게 작동하는지 이해하지 못하면 아이디어가 마술처럼 보일 수 있습니다.

    NHibernate가 게으른 로딩 목적으로 프록시를 반환하면 실제 유형에서 상속 된 프록시 인스턴스를 반환합니다. 데이터베이스에서로드를 강요하지 않고 액세스 할 수있는 몇 가지 구성원이 있습니다. 이 중에는 프록시의 ID 속성이나 필드이며,getType ()그리고 어떤 상황에서equals ()그리고getHashcode ()...에 다른 구성원에 액세스하면 데이터베이스에서로드를 강제로합니다.

    해당 발생하면 프록시가 내부 인스턴스를 만듭니다. 예를 들어, 게으른로드 된 인스턴스고객(customerProxy1029870987213409788),로드되면 내부적으로 새로운 것을 만들 것입니다.고객데이터베이스의 모든 데이터가있는 인스턴스. 그러면 프록시는 다음과 같이합니다.

    public overrides string Name
    {
        get {
           return _loadedInstance.Name;
        }
        set { _loadedInstance.Name= value; }
    }
    

    덧붙여 있으면 게으른로드를 허용하는 엔티티에서 모든 것을 가상으로 요구하는 것은이 재정의 것입니다.

    이므로 프록시의 name 속성에 대한 모든 호출이 내부에 릴레이됩니다.고객실제 데이터가있는 인스턴스입니다.

    ​​getUnproxiedType ()이것을 이용하십시오. 간단한 전화getType ()프록시에서 돌아올 것입니다TYPEOF (CustomerProxy02139487509812340)...에 통화getUnproxiedType ()내부 고객 인스턴스로 릴레이되며 내부 고객 인스턴스가 반환됩니다.TYPEOF (고객). "

    이는 DB 필드가 이미 알고있는 이드를 제외한 DB 필드가 사용되지 않아도 두 가지 프록시 엔티티를 비교하면 두 가지 프록시 엔티티를 간단하게 비교하면 데이터베이스에서로드 될 수 있습니다.

    Victor Grigoriu2021-09-04 07:54:20

    @ victor, 그렇습니다. 객체를 session.load ()로로드하여 테스트 할 수 있습니다. 나는 조금 주위를 테스트했고, true /false를 반환하더라도 equals ()의 과부하를 쓸 때까지 곧 그것을하는 것처럼 보입니다.

    Can Gencer2021-09-04 07:54:20
  • 답변 # 4

    나는 실제로이 code에 대한 책의 저자에게 앞서 나갔다. 프록시 포장이 작동하는 방식 때문이는 것입니다. 그의 응답은 다음과 같습니다.

    "프록시 프레임 워크가 어떻게 작동하는지 이해하지 못하면 아이디어가 마술처럼 보일 수 있습니다.

    NHibernate가 게으른 로딩 목적으로 프록시를 반환하면 실제 유형에서 상속 된 프록시 인스턴스를 반환합니다. 데이터베이스에서로드를 강요하지 않고 액세스 할 수있는 몇 가지 구성원이 있습니다. 이 중에는 프록시의 ID 속성이나 필드이며,getType ()그리고 어떤 상황에서equals ()그리고getHashcode ()...에 다른 구성원에 액세스하면 데이터베이스에서로드를 강제로합니다.

    해당 발생하면 프록시가 내부 인스턴스를 만듭니다. 예를 들어, 게으른로드 된 인스턴스고객(customerProxy1029870987213409788),로드되면 내부적으로 새로운 것을 만들 것입니다.고객데이터베이스의 모든 데이터가있는 인스턴스. 그러면 프록시는 다음과 같이합니다.

    public overrides string Name
    {
        get {
           return _loadedInstance.Name;
        }
        set { _loadedInstance.Name= value; }
    }
    

    덧붙여 있으면 게으른로드를 허용하는 엔티티에서 모든 것을 가상으로 요구하는 것은이 재정의 것입니다.

    이므로 프록시의 name 속성에 대한 모든 호출이 내부에 릴레이됩니다.고객실제 데이터가있는 인스턴스입니다.

    ​​getUnproxiedType ()이것을 이용하십시오. 간단한 전화getType ()프록시에서 돌아올 것입니다TYPEOF (CustomerProxy02139487509812340)...에 통화getUnproxiedType ()내부 고객 인스턴스로 릴레이되며 내부 고객 인스턴스가 반환됩니다.TYPEOF (고객). "

    이는 DB 필드가 이미 알고있는 이드를 제외한 DB 필드가 사용되지 않아도 두 가지 프록시 엔티티를 비교하면 두 가지 프록시 엔티티를 간단하게 비교하면 데이터베이스에서로드 될 수 있습니다.

    Victor Grigoriu2021-09-04 07:54:20

    @ victor, 그렇습니다. 객체를 session.load ()로로드하여 테스트 할 수 있습니다. 나는 조금 주위를 테스트했고, true /false를 반환하더라도 equals ()의 과부하를 쓸 때까지 곧 그것을하는 것처럼 보입니다.

    Can Gencer2021-09-04 07:54:20
  • 답변 # 5

    우리는 NH 2를 사용 하고이 예제는 우리에게는 효과가 없습니다. (유익한 유형 및 왼쪽 프록시 유형을 작성하지 못했습니다). 동일한 ID를 갖는 2 개의 엔티티가 동일하지 않으며, 그 중 하나가 프록지 (rangicization)이고 다른 기타는 (곰팡이 화)가 아닙니다. 우리가 계층 구조가있을 때 :

    class Organization
    class AOrganization : Organization
    class COrganization : Organization
    {
      public virtual COrganization GetConcrete()
      {
        return null;
      }
    }
    class DOrganization : COrganization
    {
      public virtual COrganization GetConcrete()
      {
        return this;
      }
    }
    AOrganization aOrganization;
    COrganization cOrganization;
    contract= new CContract(aOrganization, cOrganization as COrganization); //(COrganization)(cOrganization.GetConcrete()),
    

    CCUntract는 형식의 서지 필드를 가지고 있습니다. setter와 함께

    public class Contract: Entity <short>{
        public virtual COrganization COrganization
        {
            get { return cOrganization; }
            protected internal set
            {
                if (cOrganization != null &amp;
    &amp;
     value != cOrganization) //!= calls==, which calls Equals, which calls GetUnproxiedType()
                        throw new Exception("Changing organization is not allowed.");
                }
                cOrganization= value;
            }
        }
        private COrganization cOrganization;
    }
    

    우리는 새로운 계약을 지어주었습니다. 그 생성자는 일부 조직을 가리키는 걸림 조직을 설정합니다. 그런 다음 UnitOfWork.comMIT, NH는 (동일한 ID), GetUnProxiedType이 잘못 작동했는데 새롭고 오래된 값이 비슷하게 인식되었으며 예외가 던졌습니다.

    오류가 나타나는 곳은 다음과 같습니다.

              var otherType= other.GetUnproxiedType();
                var thisType= GetUnproxiedType();
                return thisType.IsAssignableFrom(otherType) ||
                otherType.IsAssignableFrom(thisType);
    

    디버거 : 기타 유형== coganizationProxy -getUnProxiedType 실패 ... thistype== dorganization.

    corganizationproxy 및 dorganization은 모두 상속 됨. 그래서 그들은 서로를 위해 isassignable에서 아닙니다 ...

    이 예제는 왜 당신을 위해 작동합니까?

    우리는 NH 2.0 또는 2.1이 있기 때문에?

    또는 간단한 ""대신 """?

    또는==의 구현이 있기 때문에, 엔티티뿐만 아니라 조직에서도뿐만 아니라 조직에서도=

    public abstract class Organization : Entity{
        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
        public static bool operator==(Organization object1, Organization object2)
        {
            return AreEqual(object1, object2);
        }
        public static bool operator !=(Organization object1, Organization object2)
        {
            return AreNotEqual(object1, object2);
        }
    }
    public abstract class Entity{
        public virtual TId Id { get; /*protected*/set; }
        public override bool Equals(object obj)
        {
            return Equals(obj as Entity);
        }
        private static bool IsTransient(Entity obj)
        {
            return obj != null &
    &
            Equals(obj.Id, default(TId));
        }
        private Type GetUnproxiedType()
        {
            return GetType();
        }
        public virtual bool Equals(Entity 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();
        }
        ///This method added by me
        ///For== overloading
        protected static bool AreEqual(TEntity entity1, TEntity entity2)
        {
            if ((object)entity1== null)
            {
                return ((object)entity2== null);
            }
            else
            {
                return entity1.Equals(entity2);
            }
        }
        ///This method added by me
        ///For != overloading
        protected static bool AreNotEqual(TEntity entity1, TEntity entity2)
        {
            return !AreEqual(entity1, entity2);
        }
    }
    

    "Public Type GetUnproxiedType ()"을 "Public Virtual Type GetUnProxiedType ()"에서 "Private Type GetUnProxiedType ()"를 변경했을 때 모두 작업 시작 (NH 2.0 또는 2.1이 있음)을 변경했습니다. 왜 우리는이 책에 "비공개"방법을 가지고 있습니까?

    NHusser2021-09-04 07:54:20

    공공 방법 만 도입 할 수 있을까요? 나는 아직이 code를 테스트하지 않았으므로 NH 3.0에서 작동하는지 확인할 수 없으므로 (책이 목표로하는 곳이되는 곳).

    Can Gencer2021-09-04 07:54:20
  • 답변 # 6

    우리는 NH 2를 사용 하고이 예제는 우리에게는 효과가 없습니다. (유익한 유형 및 왼쪽 프록시 유형을 작성하지 못했습니다). 동일한 ID를 갖는 2 개의 엔티티가 동일하지 않으며, 그 중 하나가 프록지 (rangicization)이고 다른 기타는 (곰팡이 화)가 아닙니다. 우리가 계층 구조가있을 때 :

    class Organization
    class AOrganization : Organization
    class COrganization : Organization
    {
      public virtual COrganization GetConcrete()
      {
        return null;
      }
    }
    class DOrganization : COrganization
    {
      public virtual COrganization GetConcrete()
      {
        return this;
      }
    }
    AOrganization aOrganization;
    COrganization cOrganization;
    contract= new CContract(aOrganization, cOrganization as COrganization); //(COrganization)(cOrganization.GetConcrete()),
    

    CCUntract는 형식의 서지 필드를 가지고 있습니다. setter와 함께

    public class Contract: Entity <short>{
        public virtual COrganization COrganization
        {
            get { return cOrganization; }
            protected internal set
            {
                if (cOrganization != null &amp;
    &amp;
     value != cOrganization) //!= calls==, which calls Equals, which calls GetUnproxiedType()
                        throw new Exception("Changing organization is not allowed.");
                }
                cOrganization= value;
            }
        }
        private COrganization cOrganization;
    }
    

    우리는 새로운 계약을 지어주었습니다. 그 생성자는 일부 조직을 가리키는 걸림 조직을 설정합니다. 그런 다음 UnitOfWork.comMIT, NH는 (동일한 ID), GetUnProxiedType이 잘못 작동했는데 새롭고 오래된 값이 비슷하게 인식되었으며 예외가 던졌습니다.

    오류가 나타나는 곳은 다음과 같습니다.

              var otherType= other.GetUnproxiedType();
                var thisType= GetUnproxiedType();
                return thisType.IsAssignableFrom(otherType) ||
                otherType.IsAssignableFrom(thisType);
    

    디버거 : 기타 유형== coganizationProxy -getUnProxiedType 실패 ... thistype== dorganization.

    corganizationproxy 및 dorganization은 모두 상속 됨. 그래서 그들은 서로를 위해 isassignable에서 아닙니다 ...

    이 예제는 왜 당신을 위해 작동합니까?

    우리는 NH 2.0 또는 2.1이 있기 때문에?

    또는 간단한 ""대신 """?

    또는==의 구현이 있기 때문에, 엔티티뿐만 아니라 조직에서도뿐만 아니라 조직에서도=

    public abstract class Organization : Entity{
        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
        public static bool operator==(Organization object1, Organization object2)
        {
            return AreEqual(object1, object2);
        }
        public static bool operator !=(Organization object1, Organization object2)
        {
            return AreNotEqual(object1, object2);
        }
    }
    public abstract class Entity{
        public virtual TId Id { get; /*protected*/set; }
        public override bool Equals(object obj)
        {
            return Equals(obj as Entity);
        }
        private static bool IsTransient(Entity obj)
        {
            return obj != null &
    &
            Equals(obj.Id, default(TId));
        }
        private Type GetUnproxiedType()
        {
            return GetType();
        }
        public virtual bool Equals(Entity 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();
        }
        ///This method added by me
        ///For== overloading
        protected static bool AreEqual(TEntity entity1, TEntity entity2)
        {
            if ((object)entity1== null)
            {
                return ((object)entity2== null);
            }
            else
            {
                return entity1.Equals(entity2);
            }
        }
        ///This method added by me
        ///For != overloading
        protected static bool AreNotEqual(TEntity entity1, TEntity entity2)
        {
            return !AreEqual(entity1, entity2);
        }
    }
    

    "Public Type GetUnproxiedType ()"을 "Public Virtual Type GetUnProxiedType ()"에서 "Private Type GetUnProxiedType ()"를 변경했을 때 모두 작업 시작 (NH 2.0 또는 2.1이 있음)을 변경했습니다. 왜 우리는이 책에 "비공개"방법을 가지고 있습니까?

    NHusser2021-09-04 07:54:20

    공공 방법 만 도입 할 수 있을까요? 나는 아직이 code를 테스트하지 않았으므로 NH 3.0에서 작동하는지 확인할 수 없으므로 (책이 목표로하는 곳이되는 곳).

    Can Gencer2021-09-04 07:54:20
  • 이전 python : 함수에 대한 BIG-O 복잡성을 자동으로 계산하는 도구가 있습니까? [중복]
  • 다음 javascript : Google 시트가있는 매크로 폴더 전체를 적용하는 방법은 무엇입니까?