Out of curiosity, what would the difference between this
implementation and one using the ForeignKeyConvention be?

using System;
using System.Reflection;
using FluentNHibernate.Conventions;

namespace SAAM.Library.Conventions
{
    /// <summary>
    /// NHibernate Convention Override for Foreign Key Column Names.
    /// </summary>
    public class CustomForeignKeyConvention : ForeignKeyConvention
    {
        /// <summary>
        /// Gets the name of the key.
        /// </summary>
        /// <param name="property">The property.</param>
        /// <param name="type">The type.</param>
        /// <returns>Name to use for Foreign Key.</returns>
        protected override string GetKeyName(PropertyInfo property,
Type type)
        {
            if (property == null)
                return type.Name + "Id";

            return property.Name + "Id";
        }
    }
}

/Michael

On Aug 17, 4:13 pm, Jim Tanner <[email protected]> wrote:
> I corrected my code like this and now works fine.
>
> public class ManyToOneConventionCorrection
>   : IReferenceConvention, IConventionAcceptance<IManyToOneInspector>
>     {
>         public void Accept(IAcceptanceCriteria<IManyToOneInspector>
> criteria)
>         {
>             criteria.Expect(x => x.Name.ToLower().StartsWith("id"));
>         }
>
>         void IConvention<IManyToOneInspector, IManyToOneInstance>.Apply
> (IManyToOneInstance instance)
>         {
>             instance.Column(instance.Name);
>         }
>     }
>
> Note : I wrote the code walking the wiki and taking advantage of the
> fluency.
> The problem originated of the wiki samples being targeted at a more
> recent API than the one of the dll i was using.
> Ie Accept method was mandatory and returning bool and now is optionnal
> and returns void.
> I don't know how much work it would take but it might be good idea if
> could release you release some documentation along with each major dll
> version.
> For instance a chm or html API doc and a snapshot of the wiki along
> with the dll.
>
> On 17 août, 21:23, James Gregory <[email protected]> wrote:
>
> > You don't need to call Accept, FNH does that.
> > Your Accept method is wrong. Where did you find that sample? This behaviour
> > changed as part of the release, Accept methods are now not required by
> > default, and you need to explicitly specify them if you want to use them.
> > You can read about it under conditional applying of
> > conventions<http://wiki.fluentnhibernate.org/Conventions#Conditional_applying_of_...>
> > .
>
> > On Mon, Aug 17, 2009 at 8:19 PM, Jim Tanner <[email protected]> wrote:
>
> > > Ok i found  the documentation and tried to implement
> > > IReferenceConvention. Is it what i need for many to one collections ?
> > > Basically i want :
> > > if my field is a mapped object and starts with id, make it a many to
> > > one.
>
> > > i found two ways to do it.
>
> > >  public class ManyToOneConventionCorrection
> > >   : IReferenceConvention
> > >    {
> > >        public bool Accept(IManyToOneInstance instance)
> > >        {
> > >            return instance.Name.ToLower().StartsWith("id");
> > >        }
>
> > >        public void Apply(IManyToOneInstance instance)
> > >        {
> > >            if (Accept(instance))
> > >                instance.Column = instance.Name;
> > >        }
> > >    }
>
> > > void ApplyConventions(AutoPersistanceModel model)
> > > {
> > >     model.Conventions.Setup(s =>s.Add<ManyToOneConventionCorrection>
> > > ())
> > > }
>
> > > It does not work, i never reach any of the code through debugger.
> > > Works well for properties IPropertyConvention and class
> > > IClassConvention, but not for IReference, at least not if reference is
> > > a many to one.
>
> > > i found this other way to define the convention which works well
> > > 2 .
> > > void ApplyConventions(AutoPersistanceModel model)
> > > {
> > > var manyToOneConventionCorrection = ConventionBuilder.Reference.When(
> > >              x => x.Expect(y => y.Name.StartsWith("id")),
> > >              z => z.Column(z.Name));
>
> > > autoPersistanceModel.Conventions.Setup(s =>s.Add
> > > (manyToOneConventionCorrection))
> > > }
>
> > > On 17 août, 19:28, James Gregory <[email protected]> wrote:
> > > > By convention your property should be CarType, not IdCarType. If your
> > > column
> > > > is IdCarType then you need to specify that manually by using Column, if
> > > this
> > > > is a domain-wide convention then you should look into defining an actual
> > > > convention <http://wiki.fluentnhibernate.org/Conventions>.
>
> > > > On Mon, Aug 17, 2009 at 5:01 PM, Jim Tanner <[email protected]> wrote:
>
> > > > > I have the following class
>
> > > > > public Car
> > > > > {
> > > > >  int Id {get;set}
> > > > > String Color {get;set}
> > > > >  CarType IdCarType {get;set}
> > > > > }
>
> > > > > I am using autoconfiguration and i get the following mapping
>
> > > > >    <id name="Id" type="Int">
> > > > >      <column name="Id" />
> > > > >      <generator class="identity" />
> > > > >    </id>
> > > > >    <property name="Color" type="String">
> > > > >      <column name="Color" />
>
> > > > >    <many-to-one name="IdCarType">
> > > > >      <column name="IdCarType_id" />
> > > > >    </many-to-one>
>
> > > > > The problem being 'IdCarType_id', my column is actually IdCarType.
--~--~---------~--~----~------------~-------~--~----~
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