Enums are fine for gender, but think of categories or other
classifications, where the knowledge level must be persisted also.

-Markus

2009/2/10 Germán Schuager <[email protected]>:
> Why can't you just use an enum?
>
> On Tue, Feb 10, 2009 at 12:18 AM, Dathan <[email protected]> wrote:
>>
>> Okay, so I'll look at pursuing that route for Gender.  Then what's the
>> best way to get a list of valid Gender's for displaying in the UI?
>> Something like (haven't tested this, just pulled it from the reference
>> docs -- the Cat example):
>>
>> List<Gender> genders = new List<Gender>();
>> IQuery query = session.CreateQuery("select c from Gender as c");
>>    foreach (Gender g in query.Enumerable())
>>        {
>>        genders.Add(g);
>>        }
>>
>> Am I on the right track?
>>
>> On Feb 9, 7:49 pm, Jason Meckley <[email protected]> wrote:
>> > the list of genders (or whatever look up) should be separate from the
>> > actual entity. validation can be done any number of ways. attributes,
>> > Validator<T>, or a series of simple bool returning members on the
>> > entity itself. I would treat Gender as a value object/entity using NH
>> > mappings instead of a string. this would allow for strategies of
>> > gender specific functionality. instead of logic like
>> >
>> > if(person.gender == "M"
>> > {}
>> >
>> > else if(person.gender == "F")
>> > {
>> >
>> > }
>> >
>> > you could do
>> > person.gender.dosomething();
>> >
>> > i would probably go with a combination of validation attributes
>> > (castle validation component) and IValidator<T> where the validation
>> > logic can be placed in a central location. The systems I design are
>> > small so I find this works well for me.
>> >
>> > On Feb 9, 7:04 pm, Dathan <[email protected]> wrote:
>> >
>> > > Something like
>> > > PersonTbl (PersonId INTEGER PRIMARY KEY IDENTITY(1,1), Name NVARCHAR
>> > > (255), GenderId INTEGER REFERENCES GenderTbl(GenderId));
>> > > GenderTbl (GenderId INTEGER PRIMARY KEY IDENTITY(1,1), Gender NVARCHAR
>> > > (10));
>> >
>> > > But where Person.Gender is a string, and is at some point by the DAL
>> > > resolved into the GenderId that corresponds to the value of the Gender
>> > > column with the same string value.
>> >
>> > > The contents of GenderTbl should never be changed by the DAL (I don't
>> > > want users defining new genders!), but we do have a case where users
>> > > being able to add to such a list might be necessary (e.g., it might be
>> > > necessary to allow users to add new cities to our gazeteer).  So,
>> > > since I'm a newbie to the terminology, yes, you might say the Gender
>> > > list is persistent, but I'm not trying to persist a collection of
>> > > genders per person.  Just a single Gender per person, plus supporting
>> > > some mechanism for validating that what the user has selected in the
>> > > frontend is a valid gender.
>> >
>> > > But I guess even that's not quite right...  I don't want to persist a
>> > > Gender object per Person (a one-to-one relationship).  I want to
>> > > create a many-to-one relationship where each Person has a reference to
>> > > either the, e.g., "Male", "Female", or "Unknown" gender.  But I'd like
>> > > to be able to, somewhere (and it just makes sense to me to do it as
>> > > part of the object model, rather than externally in the UI logic), get
>> > > a list of all valid genders (currently I do this as a string -- would
>> > > it make more sense to create a Gender object for this?) for use both
>> > > in validating user input (is the user's input in the set of valid
>> > > genders?), and in UI presentation.
>> >
>> > > On Feb 9, 4:39 pm, Fabio Maulo <[email protected]> wrote:
>> >
>> > > > The "Gender" list is persistent ?
>> >
>> > > > 2009/2/9 Dathan <[email protected]>
>> >
>> > > > > Thanks for the reply!
>> >
>> > > > > The list is, as you surmise, for UI drop-down population, but also
>> > > > > for
>> > > > > run-time validation.  I'd rather validate the value of the Gender
>> > > > > property immediately (via either Dictionary.ContainsKey() or
>> > > > > List.Find
>> > > > > (), as you suggest) than waiting for NHibernate to throw an error
>> > > > > when
>> > > > > I try to serialize the entity back to the data store (I'm an NH
>> > > > > newbie, so please correct me if I'm wrong about the behavior in
>> > > > > this
>> > > > > regard).  I'm open to advice on best practices, though, if this is
>> > > > > the
>> > > > > wrong way to go about it.
>> >
>> > > > > Given that a list of valid genders is also of use in data
>> > > > > validation
>> > > > > (which seems to be very much a domain concern, rather than
>> > > > > strictly a
>> > > > > UI concern), not just UI control, it seems logical to me that
>> > > > > embedded
>> > > > > in the person entity is an appropriate place for this information.
>> > > > >  I
>> > > > > take it this is contrary to DDD / MVC / other best practices?
>> >
>> > > > > ~Dathan
>> >
>> > > > > On Feb 9, 3:33 pm, Jason Meckley <[email protected]> wrote:
>> > > > > > why does the person entity have a static list of genders? if
>> > > > > > it's just
>> > > > > > for UI dropdown list selection, this can, and should, be done
>> > > > > > outside
>> > > > > > to scope of the person entity.
>> > > > > > I would also recommend using 2nd level cache for memory storage
>> > > > > > of the
>> > > > > > gender list rather than a static list. and I would recommend
>> > > > > > waiting
>> > > > > > on implementing the cache until
>> > > > > > 1. preformance is a documented and measurable issue
>> > > > > > 2. the problem is loading the genders and not another issue
>> > > > > > (select n
>> > > > > > +1 or unrestricted list results).
>> >
>> > > > > > the person entity would just have a Gender property which you
>> > > > > > would
>> > > > > > get;set; to a Gender field. no need for a dictionary of genders
>> > > > > > within
>> > > > > > the person entity. also, if you are going to keep a collection
>> > > > > > on any
>> > > > > > entity. use IList<T>, in this case IList<Gender>. key, value
>> > > > > > containers do not express intent and the same functionality can
>> > > > > > be
>> > > > > > gained using list.Find(predicate).
>> >
>> > > > > > On Feb 9, 12:45 pm, Dathan <[email protected]> wrote:
>> >
>> > > > > > > I'm considering porting my existing DAL to NHibernate instead.
>> > > > > > >  But
>> > > > > > > I've been reading the documentation, and there's one feature
>> > > > > > > of the
>> > > > > > > way my object model currently works that I haven't figured out
>> > > > > > > an
>> > > > > > > elegant way to do using NHibernate yet.
>> >
>> > > > > > > Say I'm representing a person.  That person has a Gender
>> > > > > > > property.  In
>> > > > > > > the database, that gender property is a foreign key to
>> > > > > > > GenderTbl.GenderId, and GenderTbl.Gender holds the string that
>> > > > > > > describes the person's gender.  What I'm doing currently is
>> > > > > > > having
>> > > > > > > something like the following:
>> >
>> > > > > > > public class Person
>> > > > > > > {
>> > > > > > >     private string gender;
>> > > > > > >     private static Dictionary<string, int> genderDict;
>> > > > > > >     private static IList<string> genderList;
>> > > > > > >     .
>> > > > > > >     .
>> > > > > > >     .
>> > > > > > >     public string Gender
>> > > > > > >     {
>> > > > > > >         get
>> > > > > > >         {
>> > > > > > >             return gender;
>> > > > > > >         }
>> > > > > > >         set
>> > > > > > >         {
>> > > > > > >             if (!genderDict.ContainsKey(value))
>> > > > > > >                 throw new ArgumentException("Invalid gender");
>> > > > > > >             gender = value;
>> > > > > > >         }
>> > > > > > >     }
>> >
>> > > > > > >     public IList<string> GenderList
>> > > > > > >     {
>> > > > > > >         get
>> > > > > > >         {
>> > > > > > >             return genderList;
>> > > > > > >         }
>> > > > > > >     }
>> >
>> > > > > > > }
>> >
>> > > > > > > My DAL initializes Person.genderDict and Person.genderList to
>> > > > > > > reflect
>> > > > > > > the contents of GenderTbl -- genderDict is used to lookup the
>> > > > > > > primary
>> > > > > > > key of a gender when the Person is serialized back to the
>> > > > > > > database
>> > > > > > > (there's a UNIQUE constraint on GenderTbl.Gender, so this
>> > > > > > > reverse
>> > > > > > > lookup will be valid).  I could just as easily do something
>> > > > > > > like:
>> > > > > > > private int gender;
>> > > > > > > private Dictionary<int, string> genderForwardDict;
>> > > > > > > private Dictionary<string, int> genderReverseDict;
>> > > > > > > public string Gender
>> > > > > > > {
>> > > > > > > get{ return genderDict[gender];};
>> > > > > > > set{ if (!genderReverseDict.ContainsKey(value)) throw new
>> > > > > > > ArgumentException(); else gender = genderReverseDict[value];}
>> >
>> > > > > > > }
>> >
>> > > > > > > And I'd be fine with that.  What I haven't figured out is how
>> > > > > > > to get
>> > > > > > > NHibernate to populate a static list of the legal values for
>> > > > > > > the
>> > > > > > > gender field (genderDict).  Or is there some other way to do
>> > > > > > > this that
>> > > > > > > I'm missing?  Specifically, I do this so view-related controls
>> > > > > > > can
>> > > > > > > bind to the list of legal values so the user can select from a
>> > > > > > > combo
>> > > > > > > box rather than having to perform a search every time or type
>> > > > > > > in a
>> > > > > > > string, etc.
>> >
>> > > > > > > Thanks!
>> >
>> > > > > > > ~Dathan
>> >
>> > > > --
>> > > > Fabio Maulo
>> >
>> >
>>
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" 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/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to