To elaborate, not initializing on method calls would only be safe if
all mapped items are properties with automatic backing fields. In
other circumstances there could be direct access to private fields
involved, and NH cannot detect when those are used.

/Oskar


2012/11/29 cremor <[email protected]>:
> 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.

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
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.

Reply via email to