Hi Chad, Thanks for pointing me in the right direction. I submitted the patch.
Hristo On Mon, Oct 5, 2009 at 7:23 PM, Chad Lee <[email protected]> wrote: > Hi Hristo, > Thanks for the patch. If you could, please create a jira issue and submit > the patch there. > > http://jira.nhforge.org/ <http://nhjira.koah.net/secure/Dashboard.jspa> > > On Mon, Oct 5, 2009 at 6:54 AM, Hristo Deshev <[email protected]>wrote: > >> >> Hi everyone, >> >> I'm using NHibernate.Linq to expose data in a REST-ful manner using >> ADO.NET Data Services (ADS). I discovered that when updating an entity >> using a HTTP PUT request, the current IUpdatable implementation will >> reset all of the entity's properties to their default (usually null) >> values. While this is the desired behavior for primitive properties, >> it shouldn't be done for entity properties. The default IUpdatable >> implementation that ADS contains for ADO.NET Entity Framework checks >> if the property is of an entity type and if so, skips resetting its >> value. >> >> I have done the same for NHibernateContext that implements IUpdatable. >> I get the property type from the IClassMetadata object and reset the >> property only if the property type IsEntityType property is false. I >> also added two tests that cover the scenarios. So, I'd like to submit >> a patch. Is this the correct place to do so? >> >> Find the patch below (also available at <http://dl.getdropbox.com/u/ >> 1838958/ResetResourceNotAffectingEntityProps.patch<http://dl.getdropbox.com/u/%0A1838958/ResetResourceNotAffectingEntityProps.patch> >> >). >> >> Best, >> Hristo Deshev >> ~~~~~~~~~~~~~~~~~~~~~ >> >> Index: src/NHibernate.Linq.Tests/IUpdatableTests.cs >> =================================================================== >> --- src/NHibernate.Linq.Tests/IUpdatableTests.cs (revision 1041) >> +++ src/NHibernate.Linq.Tests/IUpdatableTests.cs (working copy) >> @@ -216,5 +216,25 @@ >> Assert.AreSame(usr, usr2); >> } >> >> + [Test] >> + public void TestResetResourceForPrimitiveProperties() >> + { >> + var simpleEntity = (AnotherEntity) >> update.CreateResource >> ("AnotherEntities", typeof(AnotherEntity).FullName); >> + update.ResetResource(simpleEntity); >> + Assert.IsNull(simpleEntity.Output); >> + } >> + >> + [Test] >> + public void TestResetResourceForEntityProperties() >> + { >> + var complexEntity = (Role) >> update.CreateResource("Roles", typeof >> (Role).FullName); >> + var simpleEntity = (AnotherEntity) >> update.CreateResource >> ("AnotherEntities", typeof(AnotherEntity).FullName); >> + complexEntity.Entity = simpleEntity; >> + >> + update.ResetResource(complexEntity); >> + Assert.IsNull(complexEntity.Name, "Simple property >> gets reset."); >> + Assert.IsNotNull(complexEntity.Entity, "Entity >> property gets >> preserved."); >> + } >> + >> } >> } >> Index: src/NHibernate.Linq/NHibernateContext.cs >> =================================================================== >> --- src/NHibernate.Linq/NHibernateContext.cs (revision 1041) >> +++ src/NHibernate.Linq/NHibernateContext.cs (working copy) >> @@ -302,11 +302,16 @@ >> IClassMetadata metadata = >> session.SessionFactory.GetClassMetadata >> (resource.GetType().ToString()); >> object tempCopy = metadata.Instantiate(null, >> EntityMode.Poco); >> >> - // Copy the default non-keys >> - foreach (string propName in >> metadata.PropertyNames) >> + for (int i = 0; i < metadata.PropertyNames.Length; >> i++) >> { >> - object value = >> metadata.GetPropertyValue(tempCopy, propName, >> EntityMode.Poco); >> - update.SetValue(resource, propName, >> value); >> + var propertyType = >> metadata.PropertyTypes[i]; >> + var propName = metadata.PropertyNames[i]; >> + >> + if (!propertyType.IsEntityType) >> + { >> + object value = >> metadata.GetPropertyValue(tempCopy, propName, >> EntityMode.Poco); >> + update.SetValue(resource, >> propName, value); >> + } >> } >> >> //Return the new resource >> >> >> > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "NHibernate Contrib - Development Group" 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.ar/group/nhcdevs?hl=en -~----------~----~----~----~------~----~------~--~---
