nhibernate- 게으른 로딩 컬렉션 - 작동하지 않습니다
-
05-07-2019 - |
문제
나는 nhibernate 매뉴얼을 오해했거나 뭔가 잘못된 일을했다. 누구든지 도울 수 있습니까?
AuditLogentrys없이 사용자를 검색하려고합니다. 그러나 Nhibernate는 여전히 AuditLogentrys를로드하고 있습니다. 속성에 액세스 할 때 AuditLogentrys가로드되기를 원합니다.
public class User
{
public virtual int UserId { get; set; }
public virtual string UserName { get; set; }
public virtual IList<AuditLogEntry> AuditLogEntrys { get; set; }
}
public class AuditLogEntry
{
public virtual int Id { get; set; }
public virtual DateTime DateRead { get; set; }
public virtual string MachineName { get; set; }
}
매핑 :
<class name="Model.User, Model"
table="User"
lazy="true">
<id name="UserId" access="property" column="UserID">
<generator class="native"></generator>
</id>
<property name="UserName" access="property" />
<bag name="AuditLogEntrys" lazy="true" access="property">
<key column="UserID" />
<one-to-many class="Model.AuditLogEntry, Model"></one-to-many>
</bag>
<class name="Model.AuditLogEntry, Model"
table="AuditLog"
lazy="true">
<id name="Id" access="property" column="ID">
<generator class="native"></generator>
</id>
<property name="DateRead" access="property" column="DateRead"></property>
<property name="MachineName" access="property" column="MachineName"></property>
</class>
사용자를 얻기 위해 코드 :
public IList<User> GetUserByUserName(string userName)
{
ICriteria criteria = NHibernateSession.CreateCriteria(typeof(User))
.Add(Expression.Eq("UserName", userName));
return GetByCriteria(criteria);
}
이제 나는 AuditLogentry의 빈 컬렉션이있는 사용자 객체를 기대했지만 이것이 일어나는 일은 아닙니다.
어떤 아이디어 ?? 감사.
해결책
게으른로드를 사용하면 인구가 많은 객체 목록이 표시되지만 아직 데이터베이스에서 "수화"되지 않았습니다. Lazily-Loaded 객체는 엔티티 유형이 아니라 컬렉션의 항목에 액세스 할 때 실제 데이터로 채워 지거나 수화됩니다.
프록시 객체를 사용하는 것이 엔티티 유형에서 모든 속성을 가상으로 만들어야하는 이유입니다. 프록시 유형은 엔티티 유형의 동적으로 생성 된 서브 클래스로 속성에 액세스 할 때 실제 호출을합니다.
바라건대 귀하의 질문을 이해했지만 차이점은 빈 목록이 아니라 실제 객체를 되 찾는 것입니다. 빈 목록을 되 찾으면 데이터베이스에서 사용자를 참조하는 AuditLogentry 항목이 없음을 의미합니다.
제휴하지 않습니다 StackOverflow