Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 3597508
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 18, 20262026-05-18T20:07:40+00:00 2026-05-18T20:07:40+00:00

What code need to go here: ,ConventionBuilder.HasMany.Always(x => x.Key.Column( /* what code need to

  • 0

What code need to go here:

,ConventionBuilder.HasMany.Always(x => 
          x.Key.Column( /* what code need to go here? */ )) 

Aside from making this…

public virtual Person Owner { get; set; }

…to(which is ideal only on greenfield systems):

public virtual Person Person { get; set; }

How can I prevent NHibernate from producing the extraneous Person_id in its DDL creation?

Note the Person_id was produced by NH(or FNH?) even there’s already an owner_ref, and note the two references:

create table contact (contact_id int4 not null, 
                      number text, type text, owner_ref int4, 
                      Person_id int4, primary key (contact_id));
create table person (person_id int4 not null, person_name text not null, birthdate timestamp not null, primary key (person_id));
alter table contact 
      add constraint FK38B7242018FA494F 
      foreign key (owner_ref) references person;
alter table contact 
      add constraint FK38B724202B329A0D 
      foreign key (Person_id) references person;

I tried this just to make sure that it’s feasible to prevent extraneous reference

,ConventionBuilder.HasMany.Always(x => x.Key.Column("owner_ref"))   

Here’s NHibernate DDL Creation when I add that ConventionBuilder:

create table contact (contact_id int4 not null, number text, type text, 
                      owner_ref int4, primary key (contact_id));
create table person (person_id int4 not null, person_name text not null, birthdate timestamp not null, primary key (person_id));
alter table contact 
      add constraint FK38B7242018FA494F 
      foreign key (owner_ref) references person;

Note there are no more Person_id field, and there’s only one references now, which is correct. So it prevent duplicate references, it’s possible, but what I still doesn’t know is how to change the KeyColumn’s name of the collection(IList<Contact>) under Person in ConventionBuilder

Another way is to just change the KeyColumn in ClassMap directly, prevents duplicate reference in contact table…

HasMany(x => x.Contacts).Inverse().KeyColumn("owner_ref");

…, achieved the same SQL as above, but it’s better if I can make it automatic on ConventionBuilder.

How can I tell NHibernate from producing two references? Here’s the mapping code (note this: public virtual Person Owner { get; set; }. It’s not Person Person { get; set; }

    public class Person
    {
        public virtual int PersonId { get; set; }

        public virtual string PersonName { get; set; }
        public virtual DateTime Birthdate { get; set; }     

        public virtual IList<Contact> Contacts { get; set; }
    }


    public class Contact
    {
        public virtual Person Owner { get; set; }

        public virtual int ContactId { get; set; }      
        public virtual string Number { get; set; }      
        public virtual string Type { get; set; }
    }





    public class PersonMap : ClassMap<Person>
    {
        public PersonMap()
        {       

            Id(x => x.PersonId);
            Map(x => x.PersonName).Not.Nullable();
            Map(x => x.Birthdate).Not.Nullable();                   
            HasMany(x => x.Contacts).Inverse(); 
        }
    }



    public class ContactMap : ClassMap<Contact>
    {
        public ContactMap()
        {                   
            References(x => x.Owner);
            Id(x => x.ContactId).GeneratedBy.Sequence("contact_contact_id_seq");
            Map(x => x.Number);
            Map(x => x.Type);                           
        }

    }

What’s the right ConventionBuilder on that design pattern(“_ref” suffix for child table’s field referencing parent table). That potentially happen on brownfield systems too.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-18T20:07:41+00:00Added an answer on May 18, 2026 at 8:07 pm

    I have found(formulated) the solution. The key thing is we must setup the joining key on both ends of the entities, i.e. we must set it up on ConventionBuilder.HasMany and ConventionBuilder.References

    The ConventionBuilder.References is a solved problem. It is the ConventionBuilder.HasMany.Always(x => that we need to come up with a way of traversing the referencing object(e.g. Owner) from the .ConventionBuilder.HasMany.Always code.

    We must normalize the references based on Many-To-One mappings from ConventionBuilder.HasMany. Unfortunately the references property is in protected access in ClassMap. For this, we must extend the ClassMap, and use that extended class on our mappings, so we can traverse the references

    Following is the solution I coded, check the code of NormalizeReference here: http://www.ienablemuch.com/2010/12/brownfield-system-problem-on-fluent.html

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I need code in Perl for requesting and parsing ATOM and RSS feeds. Is
how to send rich text message in system.net.mail need code for send a mail
I have a console application that require to use some code that need administrator
HI, I m doing the folling stuff in the jsp code I need to
What code do you need to add in PHP to automatically have the browser
I have the following code that I need to add an additonal object to
With JPA I do not need to code the SQL for every new attribute
I have a C code base and need to programmatically identify all of the
I have a few places in the code where I need to use the
I've got a bunch of legacy code that I need to write unit tests

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.