는 문서에 따르면, 만일 Session.load (ID)는NHibernate 세션로드 메소드를 사용하면 프록시를 초기화하지 않고 엔티티의 ID에 액세스 할 수 있습니까?
초기화되지 않은 프록시이며, 실제로 데이터베이스에 접속하지 않는다 객체 ... 나는이 같은
이 크다을 반환 시나리오 (내가 db에 있다는 것을 알고)와 나중에 (동일한 세션 내에서) 엔티티의 ID에 액세스하고 일반적으로 ID에만 액세스하고 프록시를 초기화하지 않는 시나리오를로드해야합니다. 프록시의 ID에만 액세스하면 초기화 할 필요가 없다고 생각됩니다. 적어도 그것은 내가 바라는 것이지만 그렇게 할 수는 없다.
[Test]
public void Accessing_loaded_entity_id_should_not_initialize_the_proxy()
{
// Arrange
var repo = new NHRepository<Order>();
var order = new OrderBuilder().Build();
repo.Save(order);
repo.Flush();
repo.Clear();
// Act
var fromDb = repo.Load(order.ID);
// Assert
Assert.AreEqual(order.ID, fromDb.ID);
Assert.IsFalse(NHibernateUtil.IsInitialized(fromDb));
}
이 테스트는 여기에 실패 :
는 기본적으로 내가 전달하는 다음과 같은 시험을 얻으려고Assert.IsFalse (NHibernateUtil.IsInitialized (fromDb));
<id name="id" access="field"> <generator class="hilo"> <param name="column">OrderNextHi</param> <param name="max_lo">100</param> </generator> </id>
가 여기 내 기본 엔터티 형식입니다 :
업데이트 다음은 ID의 내 HBM 매핑입니다. 나는이 문제를 오래전에 카피하고 그 안에 많은 생각을 넣지 않았으므로 여기에 문제가 있다고 생각하고있다.
이public abstract class SingleIdentityDomainEntity<T> where T : SingleIdentityDomainEntity<T>
{
private readonly int id;
private int? _oldHashCode;
protected SingleIdentityDomainEntity()
{
this.id = 0;
}
public virtual int ID
{
get { return this.id; }
}
public override bool Equals(object obj)
{
var other = obj as T;
if (other == null)
return false;
// handle the case of comparing two NEW objects
if (other.IsTransient() && this.IsTransient())
return ReferenceEquals(other, this);
return other.ID.Equals(this.ID);
}
/// <summary>
/// Transient objects are not associated with an item already in storage.
/// </summary>
public virtual bool IsTransient()
{
return this.ID == 0;
}
/// <summary>
/// Must be provided to properly compare two objects
/// </summary>
public override int GetHashCode()
{
// Once we have a hash code we'll never change it
if (_oldHashCode.HasValue)
return _oldHashCode.Value;
// When this instance is transient, we use the base GetHashCode()
// and remember it, so an instance can NEVER change its hash code.
if (this.IsTransient())
{
_oldHashCode = base.GetHashCode();
return _oldHashCode.Value;
}
return this.ID.GetHashCode();
}
}
어설 션이 실제로 db에서로드를 강제 실행합니까? 당신은 SQL을 볼 수 있습니까? –
@Mark, 두 어설 션을 var i = fromDb.ID로 바꿉니다. SQL 프로파일 러에서 select sql 문이 생성되었다는 것을 확인할 수있었습니다. –
ID 속성 뒤에 코드를 게시하고 주문에서 ID proprty에 대한 매핑을 게시 할 수 있습니까? –