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
-~----------~----~----~----~------~----~------~--~---