I can see your point, but I think you're overselling the problem. Creating a
really long enum name would fail with a truncation error the first time
anyone tried to save it to the db, I'm pretty sure even the worst developer
wouldn't miss that.
Using integers on the other hand suffers from the problem of inferred value,
where if you reorder the enum the values will change. Try debugging that
one. Sure you can explicitly set the values, but that's just more work.

This whole argument is moot if you use either the suggestion from Steven, or
follow a type-safe enum pattern. Both are much safer than a plain enum.


I've just looked at the CustomSqlTypeIs("string") thing and I have no idea
why that hasn't failed before. Removing it seems to correct that issue. As
for everything else, I don't know, I'll have to investigate more.

On Wed, Feb 18, 2009 at 5:02 PM, Mark Perry <markperr...@googlemail.com>wrote:

>
> James
>
> Couple of things:
>
> EmumerationTypeConvention.cs line 19 "propertyMapping.CustomSqlTypeIs
> ("string");"
>
> AFAIK "string" is not a database type. I suspect you want to use the
> dialect
> thing here to write the correct type into the mapping.
>
> The "string" thing just broke when I tried to run it against my DB.
>
> Also although I now have:
>
> convention.AddTypeConvention(new MyEnumToIntConvention());
>
> in my auto mapping configuration my "AlterMap" method is never called
> for my enum types.
>
> I can see that the "FindConvetions" method in Conventions.cs line 80
> does return my custom convention but the AlterMap part is never
> called.
>
> Not 100% sure if this whole enum thing is supported in the auto mapper
> but thought I would being it up.
>
> Thanks, Mark
>
>
>
>
> On Feb 18, 4:14 pm, Mark Perry <markperr...@googlemail.com> wrote:
> > Thing is how big do you make your "string" column in your DB to cater
> > for all the lengths of the enums.
> >
> > The automapper is going to default to X but then some developer
> > comes along and adds "thisisareallylingenumvalue" and all of the
> > sudden
> > that's going break on the inside of the DB and make the enum cast as
> > the
> > default instead of the really long one. That is bad.
> >
> > If I use Ints in my DB not only am I safe from magic strings but I get
> > better indexing and reporting performance (yes I understand it's
> > marginal)
> > unfortunately that's how I grew up DB wise and my preferred solution.
> >
> > I realise that's more of a basic Nhibernate functionality question
> > rather than a FNH one, thanks for the swift response though.
> >
> > In your opinion am I better overloading ToString for my enum types to
> > return the Int value or creating an "AddTypeConvention" to handle it
> > there?
> >
> > Thanks, Mark
> >
> > On Feb 18, 1:33 pm, James Gregory <jagregory....@gmail.com> wrote:
> >
> > > CustomTypeIs is for specifying IUserTypes, so no that wouldn't work.
> > > Although perhaps I should remove that limitation and make CustomTypeIs
> just
> > > be for any type.
> >
> > > On Wed, Feb 18, 2009 at 1:27 PM, blindwillie <asgerhal...@gmail.com>
> wrote:
> >
> > > > Shouldn't it be possible to do it like this:
> >
> > > > Map(x => x.MyEnum).CustomTypeIs(typeof(int));
> >
> > > > Because such line seems to be ignored right now. I don't know if
> > > > removing the "highlighted" line in the automapper will change that?
> >
> > > > /Asger
> >
> > > > On Feb 18, 2:23 pm, James Gregory <jagregory....@gmail.com> wrote:
> > > > > Well, that line you highlighted in AutoMapper doesn't make any
> sense.
> > > > > Removing it allows the automapper to map Enums; however, the
> recommended
> > > > > behavior in NHibernate is to map enums as strings, and that's what
> the
> > > > > automapper does.
> > > > > If you really must use enums as ints, then you'll need to manually
> set
> > > > the
> > > > > type attribute on the property. I've updated the enum convention to
> > > > ignore
> > > > > any enum properties that already have their type set.
> >
> > > > > Map(x => x.MyEnum)
> > > > >   .SetAttribute("type", "Int32");
> >
> > > > > On Wed, Feb 18, 2009 at 9:17 AM, Mark Perry <
> markperr...@googlemail.com
> > > > >wrote:
> >
> > > > > > James
> >
> > > > > > Have you had any ideas on this one yet?
> >
> > > > > > Mark
> >
> > > > > > On Feb 13, 3:07 pm, Mark Perry <markperr...@googlemail.com>
> wrote:
> > > > > > > James
> >
> > > > > > > Is there anything I can do to help you out further?
> >
> > > > > > > Mark
> >
> > > > > > > On Feb 12, 5:51 pm, James Gregory <jagregory....@gmail.com>
> wrote:
> >
> > > > > > > > I'm not sure why those checks are in there, but I'll
> investigate
> > > > when I
> > > > > > next
> > > > > > > > get an opportunity.
> >
> > > > > > > > On Thu, Feb 12, 2009 at 4:01 PM, Mark Perry <
> > > > > > markperr...@googlemail.com>wrote:
> >
> > > > > > > > > Here as well in AutoMapComponent.cs
> >
> > > > > > > > > Line 35
> >
> > > > > > > > > if (property.PropertyType.IsEnum ||
> property.GetIndexParameters
> > > > > > > > > ().Length != 0) continue;
> >
> > > > > > > > > After taking both of the checks for
> > > > "property.PropertyType.IsEnum"
> > > > > > > > > from the source code and
> > > > > > > > > running the auto mapper I get the XML outputting correctly.
> >
> > > > > > > > > <property name="DisplayAs" column="DisplayAs"
> > > > > > > > > type="FluentNHibernate.Mapping.GenericEnumMapper`1
> > > > > > > > > [[Engineering.Domain.DisplayAs, Engineering.Domain,
> > > > Version=1.0.0.0,
> > > > > > > > > Culture=neutral, PublicKeyToken=null]], FluentNHibernate,
> > > > > > > > > Version=0.1.0.0, Culture=neutral,
> > > > PublicKeyToken=8aa435e3cb308880">
> > > > > > > > > <column name="DisplayAs" sql-type="string" />
> > > > > > > > > </property>
> >
> > > > > > > > > I guess internally it's using the
> EnumerationTypeConvention() to
> > > > do
> > > > > > > > > the business. Unfortunately I cannot get the automapper to
> break
> > > > into
> > > > > > > > > my ITypeConvention for my Enum.
> >
> > > > > > > > > Also the default is to store as a string in the DB and not
> an Int
> > > > > > > > > which it what I would like.
> >
> > > > > > > > > Dunno if any of this helps at all.
> >
> > > > > > > > > Thanks, Mark
> >
> > > > > > > > > On Feb 12, 3:19 pm, Mark Perry <markperr...@googlemail.com
> >
> > > > wrote:
> > > > > > > > > > Seems like the AutoMapper will always ignore Enums from
> the
> > > > > > generated
> > > > > > > > > > maps:
> >
> > > > > > > > > > AutoMapper.cs line 57
> >
> > > > > > > > > > if (!property.PropertyType.IsEnum &&
> > > > property.GetIndexParameters
> > > > > > > > > > ().Length == 0)
> >
> > > > > > > > > > Am I right here or should I be doing something else?
> >
> > > > > > > > > > Mark
> >
> > > > > > > > > > On Feb 12, 3:02 pm, Mark Perry <
> markperr...@googlemail.com>
> > > > wrote:
> >
> > > > > > > > > > > @Steve
> >
> > > > > > > > > > > Yeah I get the state thing but all I want is a simple
> Enum to
> > > > DB
> > > > > > int
> > > > > > > > > > > mechanism.
> > > > > > > > > > > From my previous post I don't think this is currently
> working
> > > > in
> > > > > > the
> > > > > > > > > > > AutoMapper.
> >
> > > > > > > > > > > Thanks, Mark
> >
> > > > > > > > > > > On Feb 12, 2:50 pm, Steven Harman <
> stevehar...@gmail.com>
> > > > wrote:
> >
> > > > > > > > > > > > Mark,
> > > > > > > > > > > > I like Derick Bailey's approach to solving this -
> Mapping a
> > > > > > State
> > > > > > > > > Pattern
> > > > > > > > > > > > with NHibernate:
> >
> > > > > >
> http://www.lostechies.com/blogs/derickbailey/archive/2008/11/26/mappi.
> > > > ..
> >
> > > > > > > > > > > > -steve
> >
> > > > > > > > > > > > //----  90% of being smart is knowing what you're
> dumb at
> > > > > >  ----//
> > > > > > > > >http://stevenharman.net/
> >
> > > > > > > > > > > > On Thu, Feb 12, 2009 at 9:12 AM, Mark Perry <
> > > > > > > > > markperr...@googlemail.com>wrote:
> >
> > > > > > > > > > > > > Hi
> >
> > > > > > > > > > > > > Sorry to keep pestering the list like this I feel
> like
> > > > I'm
> > > > > > being a
> > > > > > > > > > > > > right pain in the [insert word here].
> >
> > > > > > > > > > > > > I wanted to have to AutoMapper map one of my
> properties
> > > > which
> > > > > > is an
> > > > > > > > > > > > > Enum but it seems as
> > > > > > > > > > > > > if the AutoMapper just ignores it.
> >
> > > > > > > > > > > > > I know there is an example on the wiki
> >
> > > > > >http://wiki.fluentnhibernate.org/show/AutoMappingTypeConventions
> > > > > > > > > > > > > but I just want to store my enum as an Int in the
> Db and
> > > > have
> > > > > > it as
> > > > > > > > > an
> > > > > > > > > > > > > enum in my object and not go to the
> > > > > > > > > > > > > length of implementing IUserType.
> >
> > > > > > > > > > > > > I think I need to add an ITypeConvention to handle
> my
> > > > > > EnumType and
> > > > > > > > > add
> > > > > > > > > > > > > a custom attribute to describe
> > > > > > > > > > > > > the type of my enum?
> >
> > > > > > > > > > > > > Am I along the right lines here?
> >
> > > > > > > > > > > > > Thanks, Mark
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Fluent NHibernate" group.
To post to this group, send email to fluent-nhibernate@googlegroups.com
To unsubscribe from this group, send email to 
fluent-nhibernate+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/fluent-nhibernate?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to