That makes sense James...thank you very much for clarifying!

Billy

On Mar 25, 8:07 am, James Gregory <[email protected]> wrote:
> The difference is, you are overriding conventions but you're using an
> automapping override, which is for overriding how a class is automapped -
> not the same thing. It's a side-effect of how automapping is designed that
> you can use an automapping override as the same thing as a conventional
> override, but it's certainly not designed with that in mind; one day when
> I've got my benevolent dictator hat on I may fix that issue.
> Why do you have to think in terms of a specific entity? It's been a long
> time since I looked at Northwind, but surely there are a collection of
> conventions rather than one convention with a single override. You shouldn't
> think of it as changing a single entity, but all the entities that match
> that style.
>
> The conventions are designed using interfaces, so if you really do want just
> one class to be altered, then create a MyEntityOverrideConvention class that
> implements all the interfaces it needs to change.
>
> public class CustomerOverrides : IClassConvention, IIdConvention
> {
>   public bool Accept(IClassMap target)
>   {
>     return Accept(target.EntityType);
>   }
>
>   public bool Accept(IIdentityPart target)
>   {
>     return Accept(target.EntityType);
>   }
>
>   private bool Accept(Type type)
>   {
>     return type == typeof(Customer);
>   }
>
>   public void Alter(IClassMap target)
>   {
>     target.WithTable("FunnyCustomerTableName");
>   }
>
>   public void Alter(IIdentityPart target)
>   {
>     target.ColumnName("IdSpecialName");
>   }
>
> }
> On Wed, Mar 25, 2009 at 1:38 PM, Billy <[email protected]> wrote:
>
> > But to me, an override should do just that:  "override."  Accordingly,
> > you can have a "convention" which may get "overridden" on a case by
> > case basis.  Let's assume that I have one object which doesn't adhere
> > to many conventions.  (Granted, this is a bad design, but it certainly
> > comes up with legacy databases.)  Accordingly, I'll have to put an
> > explicit class and/or property exclusion into a number of convention
> > classes.  To me, that smells of shotgun surgery and doesn't allow one
> > to nicely encapsulate the overrides in one location.  E.e., if the
> > mapping rules for a customer object changes, which aren't in
> > compliance with the conventions, then I would expect that I should
> > only have to look at the customer overrides to make a modification to
> > the mapping rules.  Otherwise, I'm going to have to do a project-wide
> > find of all the customer exclusions to find the right one to modify.
>
> > Billy
>
> > On Mar 25, 4:41 am, "Martin Hornagold"
> > <[email protected]> wrote:
> > > Billy,
>
> > > I agree with James.
>
> > > The beauty of the new conventions system is that you can selectively
> > > apply conventions to classes.
>
> > > I notice from your comment about class exclusions and your comments in
> > > the PrimaryKeyConvention class in S#arp that you seem to be shying away
> > > from this.
>
> > > I have been battling with how to apply conventions/overrides within my
> > > project and am now leaning towards James' approach of targeted
> > > conventions with prescriptive class names .
>
> > > So in S#arp's Northwind sample we should have:
>
> > > IdentityIdConvention
>
> > > AssignedStringIdConvention
>
> > > Rather than just PrimaryKeyConvention
>
> > > We should have Pluralized and Singular table name conventions.
>
> > > There should also Lazy and NonLazy class conventions which would again
> > > reduce the need for overrides and are more maintainable.
>
> > > Just my 2 pennies
>
> > > Martin
>
> > > From: [email protected]
> > > [mailto:[email protected]] On Behalf Of James Gregory
> > > Sent: 25 March 2009 10:02
> > > To: [email protected]
> > > Subject: [fluent-nhib] Re: .WithTable in IAutoMappingOverride doesn't
> > > override IClassConvention
>
> > > Ah, damn. I can't re-order them. The conventions can't be applied before
> > > the overrides because the overrides may alter the underlying classmap,
> > > which could result in some conventions not being applied when they
> > > should be.
>
> > > I'd go with my previous suggestion of doing this exclusively with
> > > conventions. You've got a few options: you could have your
> > > TableNameConvention and a RegionTableNameConvention, or a
> > > PluralizedTableNameConvention and a SingularTableNameConvention, or
> > > perhaps a Plural attribute that you decorate specific entities with.
>
> > > Let me know what you think of this.
>
> > > On Wed, Mar 25, 2009 at 9:56 AM, James Gregory <[email protected]>
> > > wrote:
>
> > > Just looked into this, it seems overrides are being applied before
> > > conventions. So the changes get overwritten by the conventions... The
> > > thread you linked to is a bit of a bigger issue, but for this one I
> > > should just be able to reorder when the overrides get applied.
>
> > > An alternative is to not use overrides at all for this situation, as
> > > you're not actually doing anything with the automappings. You could just
> > > write another convention that's RegionTableNameConvention.
>
> > > Still, I'll fix this either way.
>
> > > On Tue, Mar 24, 2009 at 8:29 PM, James Gregory <[email protected]>
> > > wrote:
>
> > > Yep, something smelly is going on here. I'll investigate.
>
> > > On Tue, Mar 24, 2009 at 8:13 PM, Billy <[email protected]> wrote:
>
> > > Looks like this is related to the issue described athttp://
> > groups.google.com/group/fluent-nhibernate/browse_thread/thread/b8
> > > 66ce932b2a4f89
>
> > > Incidentally, if I modify the class convention to ignore the Region
> > > class, then the override works just fine; e.g.,
>
> > > public class TableNameConvention : IClassConvention
> > > {
> > >    public bool Accept(IClassMap classMap) {
>
> > >        return classMap.EntityType != typeof(Region);
>
> > >    }
>
> > >    public void Apply(IClassMap classMap) {
> > >        classMap.WithTable(Inflector.Net.Inflector.Pluralize
> > > (classMap.EntityType.Name));
> > >    }
>
> > > }
>
> > > But preferably, I don't want to have to put class exclusions within
> > > the convention classes, I'd rather have the overrides always take
> > > precedence.
>
> > > Billy
>
> > > On Mar 24, 2:07 pm, Billy <[email protected]> wrote:
>
> > > > Hi James,
>
> > > > I'm updating S#arp Architecture's example project to the last and have
> > > > made great progress.  In fact, the thing remaining is a problem I'm
> > > > having with an override not "taking."
>
> > > > I have the following class convention:
>
> > > > public class TableNameConvention : IClassConvention
> > > > {
> > > >     public bool Accept(IClassMap classMap) {
> > > >         return true;
> > > >     }
>
> > > >     public void Apply(IClassMap classMap) {
> > > >         classMap.WithTable(Inflector.Net.Inflector.Pluralize
> > > > (classMap.EntityType.Name));
> > > >     }
>
> > > > }
>
> > > > I then have an override for a Region class as follows:
>
> > > > public class RegionMap : IAutoMappingOverride<Region>
> > > > {
> > > >     public void Override(AutoMap<Region> mapping) {
> > > >         mapping.WithTable("Region");
> > > >         ...
> > > >     }
>
> > > > }
>
> > > > The .WithTable in the override is not getting applied, although the
> > > > other settings within the override are being applied just fine.  When
> > > > I do a select for any region objects, the SQL is trying to query a
> > > > table named Regions (which is compliant with the convention, but not
> > > > with the override).
>
> > > > Ideas?
>
> > > > Thanks!
> > > > Billy McCafferty
--~--~---------~--~----~------------~-------~--~----~
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