Does anyone have a Fluent example of how to implement the type-safe
enum pattern.

On Feb 18, 9:25 am, James Gregory <jagregory....@gmail.com> wrote:
> 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