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