How should NHibernate know that you only access the Id in
Equals/GetHashCode? It won't initialize the proxy if you don't override
Equals/GetHashCode at all, but as soon as you override it you might access
every property in there, so it needs to initialize.
On Wednesday, November 28, 2012 7:28:53 AM UTC+1, SirSirAaron wrote:
>
> Why does a dictionary lookup operation initialize a proxy if its
> respective class's equals and gethashcode method only use its Id property?
>
> namespace LookUpTest
> {
> public abstract class Entity
> {
> public virtual int Id { get; set; }
>
> public override int GetHashCode()
> {
> return Id.GetHashCode();
> }
>
> public override bool Equals(object obj)
> {
> var entity = obj as Entity;
> return entity != null && Id == entity.Id;
> }
> }
>
> public class Project : Entity
> {
> public class ProjectMap : ClassMap<Project>
> {
> public ProjectMap()
> {
> Id(x => x.Id).GeneratedBy.Assigned();
> }
> }
> }
>
>
> public class User : Entity
> {
> public virtual Project Project { get; set; }
> public class UserMap : ClassMap<User>
> {
> public UserMap()
> {
> Id(x => x.Id).GeneratedBy.Assigned();
> References(x => x.Project);
> }
> }
> }
>
> [TestFixture]
> public class LookupTests
> {
> [Test]
> public void ShouldNotInitializeProxy()
> {
> Configuration config = null;
> ISessionFactory sessionFactory =
> Fluently.Configure().Database(SQLiteConfiguration.Standard.InMemory).Mappings(m
>
> => {
> m.FluentMappings.Add<Project.ProjectMap>();m.FluentMappings.Add<User.UserMap>();}).ExposeConfiguration(cfg
>
> => config = cfg).BuildConfiguration().BuildSessionFactory();
>
> Dictionary<Project, String> stringByProject = new
> Dictionary<Project, string>();
> User userRetrievedFromDB = null;
> using (ISession session = sessionFactory.OpenSession())
> {
> //create tables
> new SchemaExport(config).Execute(true, true, false,
> session.Connection, null);
>
> Project newProject = new Project {Id = 2};
> session.Save(newProject);
>
> User newUser = new User { Id = 1, Project = newProject };
> session.Save(newUser);
>
> //force the save of the new project and new user to the DB
> session.Flush();
>
> //add entry to dictionary
> stringByProject[newUser.Project] = "test!";
>
> //evict object from session to force retrieval from DB
> session.Evict(newUser);
> session.Evict(newProject);
>
> //get user1 from DB
> userRetrievedFromDB = session.Get<User>(1);
> }
> //Able to use Id property without causing lazy initialization
> Assert.That(userRetrievedFromDB.Project.Id == 2);
> //Should be able to do a dictionary lookup without
> initializing the proxy granted gethashcode and equals only use the Id
> property
> Assert.That(stringByProject[userRetrievedFromDB.Project] ==
> "test!"); //Could not initialize proxy exception! Why?
> }
> }
> }
>
>
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/nhusers/-/7ce4T4cBUgcJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en.