I went with this:

Table

ContactInfo
id
ContactValue
ContactType
Employee_ID_FK
Customer_ID_FK
ANY_CONTACT_USER_FK
etc
.
.
.


Class
public class Contact
{
        public virtual string ContactValue { get; set; }
        public virtual short ContactType { get; set; }
}

Here is dummy table that uses contact info:
DummyContactUser(
    ID
    Name
 )
and the class:

public class DummyContactUser
    {
        public int ID { get; private set; }
        public string Name { get; set; }
        public ISet<Contact> ContactInfo { get; set; }
        public DummyContactUser()
        {
            ContactInfo = new HashedSet<Contact>();
        }
    }

and a mapping like this:

public class DummyContactUserMap : ClassMap<DummyContactUser>
    {
        public DummyContactUserMap()
        {
            Not.LazyLoad();
            Id(x => x.ID);
            Map(x => x.Name);

            HasMany(x => x.ContactInfo)
                .Component(x =>
                {

                    x.Map(y => y.ContactValue);
                    x.Map(y => y.ContactType);
                })
                .Not.LazyLoad()
                *.Table("ContactInfo")*
                *.KeyColumn("ANY_CONTACT_USER_FK");*
        }
    }

So as you can see I implemented it as a set of Components where I am using
the foreign key as the key column and I would do that kind of mapping for
every class that needs ContactInfo by changing the FK I use for each.

Does this make sense? Any pitfalls I might have missed?
Thanks.

On Sun, Aug 15, 2010 at 3:24 PM, JideO <[email protected]> wrote:

> You could use
>
> ContactInfo
>    Id
>    ContactValue
>    ContactType
>    ...
> Employee
>    EmpId
>    StaffNo
>    ...
> EmployeeContactInfo
>    EmpId
>    ContactInfoId
>    ...
> Person
>    PersonId
>    FirstName
>    ...
> PersonContactInfo
>    PersonId
>    ContactInfoId
>    ...
>
> etc etc. You'd have one EntityContactInfo table for each Entity that
> needs to use the ContactInfo. The relationship between
> EntityContactInfo and ContactInfo can simply be unidirectional but i'm
> sure it can be done bidirectionally with some inheritance.
>
> A warning, as FB has noted earlier, this comes with the responsibility
> of managing the additional complexity that comes with what this
> multiple unlimited address thing. If you have no other choice...but
> sometimes reexamining what you're trying to achieve may help you
> simplify it a little.
>
> Jide
>
>
> On Aug 15, 12:45 pm, "Frans Bouma" <[email protected]> wrote:
> > > Thanks Frans for the explanation but if you could bear with me a bit
> more:
> > > I understand the idea of using a component that has the actual columns
> in
> > > the parent table instead of a separate table. But as far as I know this
> > > works if the component is a single instance and not a collection:
> > > Person.SingleContactInfo
> > > Not Person.ListOfContactInfo
> > > because a list of contactInfo would not be of a predetermined size, so
> how
> > > would the columns be on the database side (how many columns to
> represent
> > the
> > > contactInfo?)
> >
> >         that's indeed a problem with using components in this case: a
> > flexible list of contact infos, which can be extended till whatever size
> is
> > indeed requiring that you model it outside the entity. I refered to
> > 'phonenumber' as a metaphore in my previous email as you often see this
> > happening with phonenumber as well: "we need different types of
> > phonenumbers: mobile, landline, work, home, second, third. etc..", which
> > could indeed be done by creating an entity out of it (so keep ContactInfo
> as
> > a separate entity), but it's also a sign you might want to take a step
> back
> > and think about if you need the list of contact info's, as it comes with
> a
> > price: you need extra logic, as I described.
> >
> >         Say you want to stick with the list thing, and really want it
> that
> > way, you can keep the ContactInfo table, and solve it in two ways:
> >
> > 1) Keep it but it's only for Employee. Add an FK to Employee in the
> > ContactInfo table and rename the table to EmployeeContactInfo. This is
> > straight forward.
> > 2) Create a ContactGroup table, which contains 1 field: ID* and in the
> > tables which have to have a list of contacts, add an FK field to
> > ContactGroup. In ContactInfo, add an FK to ContactGroup. So EMployee '5'
> has
> > as ContactGroupId (the fk to ContactGroup) the value '3', and in
> ContactInfo
> > there are 1 or more rows with the FK field ContactGroupId set to 3. To
> > obtain the contacts for Employee, you thus join with Contactgroup and
> > ContactInfo.
> >
> >         FB
> >
> >
> >
> >
> >
> >
> >
> > > Thanks
> >
> > > On Sun, Aug 15, 2010 at 1:44 PM, Frans Bouma <[email protected]> wrote:
> >
> > >    > The main problem is that ContactInfo is not used by only the
> > > Employee
> > >    > Entity, that is why I am not sure how to design it on the database
> > > side.
> >
> > >           You mix type with instance. If you define a ContactInfo
> > > component
> > >    (Valuetype in DDD), it's a type. You can re-use that in multiple
> > > entities.
> > >    It just doesn't have its own table, as it's not a separate entity
> > > (you can't
> > >    save it separately and fetch it separately, as it doesn't make
> > sense,
> > > it
> > >    only makes sense in the context of its containing entity)
> >
> > >    > Also, specifiying JUST 3 Contact Infos for the Employee does not
> > > work
> > >    since
> > >    > the user must be able to add and remove from the contact info as a
> > > list.
> > >    > Same goes for Address table, it is used by more than one entity
> > and
> > >    probably
> > >    > by the same entity more than once.
> >
> > >           Instance or type re-use? I was talking about instance re-use.
> > > In
> > >    almost all applications which request an 'address' to be filled in,
> > > you
> > >    can't select one from a list, you just fill in the fields, like with
> > > name,
> > >    day of birth etc. So the fields making up the 'address' are simply
> > > part of
> > >    the entity they belong to, you won't share an address instance (i.e.
> > > the
> > >    data!) with another entity by letting that OTHER entity reference
> > the
> > > same
> > >    row, but you will do that with a real entity, like Customer.
> >
> > >           Address, and also contact info, phone numbers (same thing),
> > > are 'on
> > >    the edge' of being seen as entity or valuetype, as you can add an
> > > 'id' and
> > >    it looks like an entity. But you've to think about how it behaves in
> > > the
> > >    domain model: what is its purpose: if its purpose is to group fields
> > > inside
> > >    an entity, you shouldn't create it as an entity, but as a component
> > >    (valuetype).
> >
> > >           Your UI reference that the user should add/remove it from a
> > > list is
> > >    typical for the point of view where address, contact info,
> > > phonenumber etc.
> > >    are seen as real entities, but a question was asked how to model it,
> > > and I
> > >    think it's wiser to look into why you'd really want to define it as
> > > an
> > >    entity. For example, your list idea in the UI, requires extra logic,
> > > like do
> > >    I allow 10 contact info's all of the same type for an employee? Does
> > > it have
> > >    to have contact info of at least 3 different types?
> >
> > >                   FB
> >
> > >    > On Sun, Aug 15, 2010 at 12:33 PM, Frans Bouma <[email protected]>
> wrote:
> >
> > >    >       > I have a ContactInfo Table :
> > >    >       > ContactInfo(
> > >    >       >       ID int IDENTITY(1,1) NOT NULL, --PK
> > >    >       >       ContactValue varchar(100) NOT NULL,
> > >    >       >       ContactType smallint] NOT NULL
> > >    >       > )
> > >    >       > In my model multiple entities/tables would need to have a
> > > list of
> > >    >       > ContactInfo entries.
> > >    >       > Example:
> >
> > >    >       > Employee has 3 contact infos: 1 email and 2 phone numbers.
> > > I would
> > >    > then
> > >    >       have
> > >    >       > a ContactInfo with ContactType = 2(email), and 2
> > > ContactInfo with
> > >    > Type =
> > >    >       > 1(phone).
> >
> > >    >              ContactInfo isn't an entity. An entity is a group of
> > >    > attributes
> > >    >       (fields) with its own identity. Your contact info isn't
> > that,
> > > it's 1
> > >    > value.
> >
> > >    >              So I'd model it as a Component, and define 3 contact
> > > infos in
> > >    >       Employee. This is less flexible (you can't add more without
> > >    modifying
> > >    >       employee), however it's IMHO better, because you're not
> > going
> > > to re-
> > >    > use
> > >    >       contactinfo. It's the same as address. A lot of people model
> > > that as
> > >    > a
> > >    >       separate entity, which is in most cases not really
> > > beneficial, as
> > >    you
> > >    > don't
> > >    >       re-use entity instances (rows in the table)
> >
> > >    >                      FB
> >
> > >    >       > Now the question is how to link this Entity to the
> > > different
> > >    users?
> > >    > It
> > >    >       looks
> > >    >       > like inheritance with only a difference in foreign keys.
> > > Does
> > >    > adding an FK
> > >    >       > to every user Table make sense / good design?
> >
> > >    >       > Also, how do we represent such a thing in the domain
> > model?
> > > Do we
> > >    > create
> > >    >       > duplicate classes for every use? EmployeeContactInfo,
> > >    > ClientContactInfo,
> > >    >       > etc... How do we map those?
> >
> > >    >       > I know those are a lot of questions but I think the idea
> > is
> > > clear
> > >    > enough,
> > >    >       > thanks for the help in advance.
> >
> > >    >       > --
> > >    >       > 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]<nhusers%[email protected]>
> > > <mailto:nhusers%[email protected]<nhusers%[email protected]>
> >
> >
> > >    > 
> > > <mailto:nhusers%[email protected]<nhusers%[email protected]>
> > > <mailto:nhusers%[email protected]<nhusers%[email protected]>>
> > .
> >
> > >    >       > For more options, visit this group at
> > >    >       >http://groups.google.com/group/nhusers?hl=en.
> >
> > >    >       --
> > >    >       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]<nhusers%[email protected]>
> > > <mailto:nhusers%[email protected]<nhusers%[email protected]>
> >
> >
> > >    > 
> > > <mailto:nhusers%[email protected]<nhusers%[email protected]>
> > > <mailto:nhusers%[email protected]<nhusers%[email protected]>>
> > .
> >
> > >    >       For more options, visit this group at
> > >    >http://groups.google.com/group/nhusers?hl=en.
> >
> > >    > --
> > >    > 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]<nhusers%[email protected]>
> > > <mailto:nhusers%[email protected]<nhusers%[email protected]>>
> .
> > >    > For more options, visit this group at
> > >    >http://groups.google.com/group/nhusers?hl=en.
> >
> > >    --
> >
> > >    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]<nhusers%[email protected]>
> > > <mailto:nhusers%[email protected]<nhusers%[email protected]>>
> .
> > >    For more options, visit this group at
> > >http://groups.google.com/group/nhusers?hl=en.
> >
> > > --
> > > 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]<nhusers%[email protected]>
> .
> > > For more options, visit this group at
> > >http://groups.google.com/group/nhusers?hl=en.- Hide quoted text -
> >
> > - Show quoted text -
>
> --
> 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]<nhusers%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/nhusers?hl=en.
>
>

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