Sal,

I work with Chris  (ok he's my boss)

Another thing we do is use reflection to see the calling assembly, this
same approach could be used for dirty checking


         set
         {
            DateTime dtStartDate = Entity.StartDate;
            Entity.StartDate =
ReportChange(Assembly.GetCallingAssembly(), ref dtStartDate, value);
         }


     /// <summary>
      /// The implementation of each ReportChange overload.
      /// </summary>
 
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design",
"CA1045:DoNotPassTypesByReference", MessageId = "1#")]
      protected T ReportChange<T>(Assembly a_oCallingAssembly, ref T
a_oOldValue, T a_oNewValue)
      {
         // The calling assembly is used to detect whether property
setters are being called from
         // data abstraction or external, i.e. XML serialization or
database persistence, software.
         ScrubData<T>(ref a_oNewValue);
         ScrubData<T>(ref a_oOldValue);

         if (((a_oOldValue == null) && (a_oNewValue != null)) ||
             ((a_oOldValue != null) &&
(!a_oOldValue.Equals(a_oNewValue))))
         {
            if
(a_oCallingAssembly.GetName().Name.StartsWith(_sRootNamespace))
            {
               ObjectIsDirty = true;
            }

            //Validate<T>(ref a_oNewValue);

            //assign value
            a_oOldValue = a_oNewValue;

         }

         return a_oOldValue;
      }


Where

-- Lazy load example

         get
         {
            return
GetDataObject<ClaimFirmErrorAndOmission>(Assembly.GetCallingAssembly(),
               ref _oClaimFirmErrorAndOmission);
         }



  /// <summary>
      /// This method should be used by DAL-implementation only property
getters that load a single foreign key object.  
      /// It will perform the work of lazy loading data into a data
object.  It will only lazy load
      /// objects when the calling assembly is a DAL assembly.  This is
because we don't want persistence services
      /// to call back into themselves for lazy loading.
      /// </summary>
      /// <typeparam name="ImplType"></typeparam>
      /// <param name="a_oCallingAssembly">Calling assembly.</param>
      /// <param name="a_oChildDataObject">Child data object.</param>
      protected ImplType GetDataObject<ImplType>(Assembly
a_oCallingAssembly, ref ImplType a_oChildDataObject) where ImplType :
DataObject, new()
      {
         if
(a_oCallingAssembly.GetName().Name.StartsWith(_sRootNamespace))
         {
            GetDataObject<ImplType>(ref a_oChildDataObject);
         }

         return a_oChildDataObject;
      }



-----Original Message-----
From: Sal Bass [mailto:salbass...@hotmail.com] 
Sent: Thursday, May 28, 2009 1:43 PM
To: user-cs@ibatis.apache.org
Subject: RE: Dirty Tracking Issue


Could you post a brief example?


----------------------------------------
> Subject: RE: Dirty Tracking Issue
> Date: Thu, 28 May 2009 12:34:09 -0600
> From: christopher.pot...@nfs.stoneriver.com
> To: user-cs@ibatis.apache.org
>
> Hi Sal:
>
> We've implemented a very similar piece of functionality in our
organization. We leveraged .Net's explicit interfaces feature to address
the complex property issue you describe below. The explicit interface
properties are used by non-iBATIS object model consumers and the actual
implementation properties are used by iBATIS. This allows the
functionality in the object model to distinguish behavior amongst
multiple model consumers. Another advantage we've found with this
approach is in the area of lazy loading. We can engage lazy loading when
we're a non-iBATIS object model consumer and avoid it when iBATIS is
populating the object model.
>
> I hope this helps,
> Chris Potter
>
> Confidentiality Notice: This E-mail message, including any
attachments, is for the sole use of intended recipient(s) and may
contain confidential and privileged information. Any unauthorized
review, use, disclosure or distribution is prohibited. If you are not
the intended recipient, please contact the sender by reply email and
destroy all copies of the original message.
>
>
> -----Original Message-----
> From: Sal Bass [mailto:salbass...@hotmail.com]
> Sent: Thursday, May 28, 2009 11:55 AM
> To: user-cs@ibatis.apache.org
> Subject: Dirty Tracking Issue
>
>
> I am having a dilema with implementing dirty tracking on my entities.
I am using AOP to mark an entity as "dirty" when a property is set. The
problem occurs when I load the entities using Ibatis because it sets the
properties during mapping which makes the entity dirty (no, I can't use
constructor mapping here). So, I use a RowDelegate to mark the entity
clean before returning it. Works great....except for when I am loading a
root object with several complex properties (ILists of other entities).
The RowDelegate is obviously not fired for each complex property, so
they are returned as dirty.
>
> Any idea of how I can get at all of the complex properties to mark
them clean before returning the entity?
>
>
>
> _________________________________________________________________
> Hotmail(r) goes with you.
>
http://windowslive.com/Tutorial/Hotmail/Mobile?ocid=TXT_TAGLM_WL_HM_Tuto
rial_Mobile1_052009
_________________________________________________________________
Hotmail(r) goes with you. 
http://windowslive.com/Tutorial/Hotmail/Mobile?ocid=TXT_TAGLM_WL_HM_Tuto
rial_Mobile1_052009

Reply via email to