You could always create a backing field for your properties, and set the
Fluent Access to Field (with whatever convention style you decide, i.e.
PascalCase with a mUnderscore prefix).

On Tue, Apr 28, 2009 at 7:10 PM, [email protected]
<[email protected]>wrote:

>
> Hi all,
>
> I've ran into a problem when I tried to migrate the idea of  this
> artice 'http://www.codeproject.com/KB/cs/NHibernateForWinforms.aspx'
> to fluent:
>
> I use this approach in my projects, but the one that I'm currently
> working has a table with a composite primary key.
>
> This is my class...
> namespace Hist.Core.Domain
> {
>    public class AssetPrice : DomainObject<AssetPrice.AssetPriceID>
>    {
>        #region CompositeID Definition
>
>        /// <summary>
>        /// CompositeID Definition for AssetPrice class
>        /// </summary>
>        [Serializable]
>        public class AssetPriceID
>        {
>            public DateTime Date { get; protected set; }
>            public int AssetIndex { get; protected set; }
>            public int QualifierIndex { get; protected set; }
>
>            public AssetPriceID() { }
>
>            public AssetPriceID(DateTime priceDate,int assetIndex,int
> qualifierIndex)
>            {
>                Date = priceDate;
>                AssetIndex = assetIndex;
>                QualifierIndex = qualifierIndex;
>            }
>
>            public override bool Equals(object obj)
>            {
>                if (obj == this) return true;
>                if (obj == null) return false;
>
>                AssetPriceID that = obj as AssetPriceID;
>                if (that == null)
>                {
>                    return false;
>                }
>                else
>                {
>                    if (AssetIndex != that.AssetIndex) return false;
>                    if (QualifierIndex != that.QualifierIndex) return
> false;
>                    if (Date.CompareTo(that.Date) != 0) return false;
>
>                    return true;
>                }
>
>            }
>
>            public override int GetHashCode()
>            {
>                return HashCodeGenerator.GenerateHashCode(Date,
> AssetIndex, QualifierIndex);
>            }
>
>        }
>        #endregion
>
>        #region Properties
>
>        public virtual DateTime Date { get { return base.ID.Date; } }
>        public virtual int AssetIndex { get { return
> base.ID.AssetIndex; } }
>        public virtual int QualifierIndex { get { return
> base.ID.QualifierIndex; } }
>        public virtual int ProviderIndex { get; set; }
>        public virtual double Price { get; set; }
>        #endregion
>
>        #region Constructors
>
>        public AssetPrice() {  }
>        public AssetPrice(AssetPriceID id)
>        {
>            base.ID = id;
>        }
>        #endregion
>
>        #region Public Methods
>
>        public override int GetHashCode()
>        {
>            return ID.GetHashCode();
>        }
>
>         public override string ToString()
>        {
>            return this.GetPropertiesInfo();
>        }
>        #endregion
>    }
> }
>
> and this is the base class
>    /// <summary>
>    /// For a discussion of this object, see
>    ///
> http://devlicio.us/blogs/billy_mccafferty/archive/2007/04/25/using-equals-gethashcode-effectively.aspx
>    /// </summary>
>    public abstract class DomainObject<IdT>
>    {
>        public static readonly string IDStr = "ID";
>        private IdT id = default(IdT);
>
>        /// <summary>
>        /// ID may be of type string, int, custom type, etc.
>        /// Setter is protected to allow unit tests to set this
> property via reflection and to allow
>        /// domain objects more flexibility in setting this for those
> objects with assigned IDs.
>        /// </summary>
>        /// <value>The ID.</value>
>        public virtual IdT ID
>        {
>            get { return id; }
>            protected set { id = value; }
>        }
>
>
>        /// <summary>
>        /// Determines whether the specified <see
> cref="T:System.Object"/> is equal to the current <see
> cref="T:System.Object"/>.
>        /// </summary>
>        /// <param name="obj">The <see cref="T:System.Object"/> to
> compare with the current <see cref="T:System.Object"/>.</param>
>        /// <returns>
>        /// true if the specified <see cref="T:System.Object"/> is
> equal to the current <see cref="T:System.Object"/>; otherwise, false.
>        /// </returns>
>        /// <exception cref="T:System.NullReferenceException">The
> <paramref name="obj"/> parameter is null.</exception>
>        /// <remarks>
>        /// HACK:Removed the sealed property, because the tests were
> failing.
>        /// </remarks>
>        public override bool Equals(object obj)
>        {
>            DomainObject<IdT> compareTo = obj as DomainObject<IdT>;
>
>            return (compareTo != null) &&
>                   (HasSameNonDefaultIdAs(compareTo) ||
>                // Since the IDs aren't the same, either of them must
> be transient to
>                // compare business value signatures
>                    (((IsTransient()) || compareTo.IsTransient()) &&
>                     HasSameBusinessSignatureAs(compareTo)));
>        }
>
>        /// <summary>
>        /// Transient objects are not associated with an item already
> in storage.  For instance,
>        /// a <see cref="Customer"/> is transient if its ID is 0.
>        /// </summary>
>        /// <returns>
>        ///     <c>true</c> if this instance is transient; otherwise,
> <c>false</c>.
>        /// </returns>
>        public virtual bool IsTransient()
>        {
>            return ID == null || ID.Equals(default(IdT));
>        }
>
>        /// <summary>
>        /// Must be provided to properly compare two objects
>        /// </summary>
>        /// <returns>
>        /// A hash code for the current <see cref="T:System.Object"/>.
>        /// </returns>
>        public abstract override int GetHashCode();
>
>        /// <summary>
>        /// Determines whether [has same business signature as] [the
> specified compare to].
>        /// </summary>
>        /// <param name="compareTo">The compare to.</param>
>        /// <returns>
>        ///     <c>true</c> if [has same business signature as] [the
> specified compare to]; otherwise, <c>false</c>.
>        /// </returns>
>        private bool HasSameBusinessSignatureAs(DomainObject<IdT>
> compareTo)
>        {
>            //Check.Require(compareTo != null, "compareTo may not be
> null");
>
>            return GetHashCode().Equals(compareTo.GetHashCode());
>        }
>
>        /// <summary>
>        /// Returns true if self and the provided persistent object
> have the same ID values
>        /// and the IDs are not of the default ID value
>        /// </summary>
>        /// <param name="compareTo">The compare to.</param>
>        /// <returns>
>        ///     <c>true</c> if [has same non default id as] [the
> specified compare to]; otherwise, <c>false</c>.
>        /// </returns>
>        private bool HasSameNonDefaultIdAs(DomainObject<IdT>
> compareTo)
>        {
>            //Check.Require(compareTo != null, "compareTo may not be
> null");
>
>            return (ID != null && !ID.Equals(default(IdT))) &&
>                   (compareTo.ID != null && !compareTo.ID.Equals
> (default(IdT))) &&
>                   ID.Equals(compareTo.ID);
>        }
>
>    }
>
>
> However, everytime the FixtureBase class throws an error when I reach
> SessionSource = new SessionSource(cfg.ToProperties(), new TModel
> ());...
>
>    public class FixtureBase<TModel> where TModel : PersistenceModel,
> new()
>    {
>        protected SessionSource SessionSource { get; set; }
>        protected ISession Session { get; private set; }
>
>        [SetUp]
>        public void SetupContext()
>        {
>            Console.WriteLine("********* Setup Context *********");
>            var cfg = new SQLiteConfiguration()
>                .InMemory()
>                .ProxyFactoryFactory
> ("NHibernate.ByteCode.Spring.ProxyFactoryFactory,
> NHibernate.ByteCode.Spring")
>                .ShowSql();
>
>            SessionSource = new SessionSource(cfg.ToProperties(), new
> TModel());
>
> Here, I get the following exception:
>
> PoloHist.Tests.CoreTest.ModelTests.PoloAssetPricesTests.can_correctly_map_PoloAssetPrice:
> NHibernate.PropertyNotFoundException : Could not find a setter for
> property 'Date' in class 'PoloHist.Core.Domain.PoloAssetPrice'
>
> Ok, I can see the exception, but if I remove the protected clause,
> I'll go against the hole thing that I'm trying to do, that is, protect
> the ID.
>
> What should I do. Should I change my implementation?
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Fluent NHibernate" 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/fluent-nhibernate?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to