Understood. Ok, well, let's see if this works:
HasMany(x=>
x.CreditCards).AsBag().KeyColumn("PolNbr").PropertyRef("PolicyNumber");

The PropertyRef should allow you to map to a non-key column in the parent
table. On the References() side it allows you to map to a non key property
in the related table. PropertyRef is for mapping lagacy data specifically.

If that doesn't work, do a quick ExportTo() in your config and paste the
hbm.xml mappings if you could, so I can make sure FNH is writing the correct
XML.

You're fortunate that you're going from Composite to a single id, and not
the other way around. NHibernate doesn't support Hibernate's <properties>
tag yet, which means you can only map from one column to another (hibernate
allows you to do many columns to many columns in a property-ref)

On Tue, Jan 19, 2010 at 8:59 PM, Corey Coogan <[email protected]> wrote:

> Thanks again Hudson.  I'm totally with you on the DB stuff and have
> read quite a bit on the relationships. Unfortunately, most the tables
> truly need a PolicyNumber and PolicyDate as the composite key.  That's
> because everytime a policy is renewed or changed in any way, a new
> "portfolio" gets created which is a whole mess of tables with those 2
> columns used to identify them.  On the other hand, something like
> CreditCard, is tied to a policy regardless of it's portfolio, so in
> this case it is related to a PolicyNumber only.
>
> I realized that the keys typically match up as a traditional foreign
> key constraint, but that's not the way these two tables are related,
> which is why I'm posting this question.  These are tied together today
> with a hand-rolled data access layer.  The user specifies a
> policynumber and an as of date and the following queries are executed
> on a single open connection:
>
> - Get the max(policydate) <= asOfDate
> - Ge the Policy record for the PolicyNumber/PolicyDate
> - Get credit cards for the PolicyNumber
>
> I'm OK with specifiying a hand-written sql statement if necessary.
> Maybe I need to handle these cases where there is no real FK in the
> database by populating with an NH query after the initial retrieval.
> I'm just looking for the best way to map this stuff despite the ugly
> nature of what I'm working with.  So I although I appreciate the
> advice regarding DB design, but this is truly out of my hands.
>
> Thanks,
> Corey
>
> On Jan 19, 3:44 pm, Hudson Akridge <[email protected]> wrote:
> > By the HasMany declaration. This is a one-to-many mapping in NH lingo,
> and
> > I'd recommend reading up on
> > that<
> http://ayende.com/Blog/archive/2009/04/13/nhibernate-mapping-ltsetgt....>.
> > NHibernate is smart enough to know what your ParentId column is on Policy
> > when going to the child table (CreditCards), it only needs to be told
> what
> > column matches the ParentId in the child (CreditCards) table. In your
> case,
> > it's PolNbr.
> >
> > I'd recommend against using composite keys in your mapping. You don't
> have
> > to mirror how the database has declared things. In that case, if
> > PolicyNumber is truly your ID, which it seems like you can do since
> things
> > that relate to your Policies only contain a PolicyId back to their
> parent,
> > then that's the only column that needs to be specified as your Id.
> >
> > Composite Keys are for when there's no other option in my opinion, and if
> > you declare composite keys, any children tables must also have the
> parents
> > composite key columns contained within them to make for a valid database
> > relationship. Since the CreditCards table appears to only have the
> > PolicyNumber (PolNbr) then you, by database semantics, should be able to
> > just treat a Policy as unique in the business domain by nothing more than
> a
> > PolicyNumber. If that wasn't a case, a CreditCard could belong to
> multiple
> > Policies, and in that case, the DBA has made an error and really needs a
> > join table between Policies and CreditCards.
> >
> >
> >
> > On Tue, Jan 19, 2010 at 3:18 PM, Corey Coogan <[email protected]>
> wrote:
> > > Wait, I just realized that I may still be confused.  Your example is
> > > assigning Id(x =>, but this is a composite key.  How will FNH know
> > > that PolicyNumber=PolNbr?
> >
> > > On Jan 19, 2:37 pm, Hudson Akridge <[email protected]> wrote:
> > > > I'm guessing that PolicyNumber/PolicyDate in Policy are mapped as a
> > > > composite key?
> >
> > > > Is there any reason for this other than that's what the database has
> > > mapped
> > > > it as? Is PolicyNumber a valid entity Identifier as far as the domain
> > > model
> > > > is concerned?
> >
> > > > If so, then you'd just map PolicyNumber with an
> > > > Id(x=> x.PolicyNumber).GeneratedBy.Assigned(); //Just a guess on the
> > > > assigned thing since I think your app might generate them
> >
> > > > And map your collection like so:
> > > > HasMany<CreditCard>(x => x.CreditCards).AsBag()
> > > >                .KeyColumn(PolNbr );
> >
> > > > Viola. Done. No need for a where at all there.
> >
> > > > Now, given that I caught a mapping. prefix, I'm assuming you're using
> an
> > > > automapper. I'd advise against it in your case. It's very rare to
> expect
> > > > automapper to automagically map for a legacy database environment.
> Swap
> > > to
> > > > Fluent Mappings.
> >
> > > > On Tue, Jan 19, 2010 at 1:06 PM, Corey Coogan <[email protected]
> >
> > > wrote:
> > > > > I have 2 entities that are described below.  I want to map many
> credit
> > > > > cards to one policy.  There is no proper FK between them in our
> Oracle
> > > > > DB (I can't change the DB at all).  They do match up on the
> > > > > PolicyNumber->PolNbr properties though.
> >
> > > > > I can't figure out how to map this relationship.  Here's what I
> have
> > > > > so far, but I'm not sure how to specify the Key in the containing
> > > > > entity that doesn't match.
> >
> > > > > mapping.HasMany<CreditCard>(x => x.CreditCards)
> > > > >                .KeyColumn(PolNbr )
> > > > > //where to map CreditCard.PolNbr to Policy.PolicyNumber
> >
> > > > > Policy
> > > > > {
> > > > > PolicyNumber : string (PK)
> > > > > PolicyDate : date (PK)
> > > > > CreditCards : IList<CreditCard>
> > > > > }
> >
> > > > > CreditCard
> > > > > {
> > > > > PolNbr : String (PK)
> > > > > CcType : String (PK)
> > > > > ExpDt : String (PK)
> > > > > //3 more columns that are the PK
> > > > > }
> >
> > > > > --
> > > > > You received this message because you are subscribed to the Google
> > > Groups
> > > > > "Fluent NHibernate" group.
> > > > > To post to this group, send email to
> > > [email protected].
> > > > > To unsubscribe from this group, send email to
> > > > > [email protected]<fluent-nhibernate%[email protected]>
> <fluent-nhibernate%[email protected]<fluent-nhibernate%[email protected]>
> >
> > > <fluent-nhibernate%[email protected]<fluent-nhibernate%[email protected]>
> <fluent-nhibernate%[email protected]<fluent-nhibernate%[email protected]>
> >
> >
> > > > > .
> > > > > For more options, visit this group at
> > > > >http://groups.google.com/group/fluent-nhibernate?hl=en.
> >
> > > > --
> > > > - Hudsonhttp://www.bestguesstheory.comhttp://
> twitter.com/HudsonAkridge
> >
> > > --
> > > You received this message because you are subscribed to the Google
> Groups
> > > "Fluent NHibernate" group.
> > > To post to this group, send email to
> [email protected].
> > > To unsubscribe from this group, send email to
> > > [email protected]<fluent-nhibernate%[email protected]>
> <fluent-nhibernate%[email protected]<fluent-nhibernate%[email protected]>
> >
> > > .
> > > For more options, visit this group at
> > >http://groups.google.com/group/fluent-nhibernate?hl=en.
> >
> > --
> > - Hudsonhttp://www.bestguesstheory.comhttp://twitter.com/HudsonAkridge
>
> --
> You received this message because you are subscribed to the Google Groups
> "Fluent NHibernate" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<fluent-nhibernate%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/fluent-nhibernate?hl=en.
>
>
>
>


-- 
- Hudson
http://www.bestguesstheory.com
http://twitter.com/HudsonAkridge
--
You received this message because you are subscribed to the Google Groups "Fluent NHibernate" 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/fluent-nhibernate?hl=en.

Reply via email to