Search code examples
c#nhibernatefluent-nhibernatenhibernate-mapping

How to map IDictionary<string, Entity> in Fluent NHibernate


I have an class with an IDictionary on it.

  <map name="CodedExamples" table="tOwnedCodedExample">
    <key>
      <column name="OwnerClassID"/>
    </key>
    <index type="string" column="ExampleCode"/>
    <many-to-many class="CodedExample" column ="CodedExampleClassID"/>
  </map>

as you can see it uses a many-to-many to get the CodedExamples from their table using the tOwnedCodedExample table to find which are owned by the OwnerClass.

I realise that this is a very basic (and hopefully standard) mapping but am struggling and can't find any documentation for it, therefore would be very grateful of any help possible.

Many Thanks

Stu


Solution

  • I have a working example, this should make it clear to you.

    Classes:

    public class Customer : Entity
    {        
        public IDictionary<string, Book> FavouriteBooks { get; set; }
    }
    
    public class Book : Entity
    {
        public string Name { get; set; }
    }
    

    And then the map:

    HasManyToMany<Book>(x => x.FavouriteBooks)
                .Table("FavouriteBooks")                
                .ParentKeyColumn("CustomerID")
                .ChildKeyColumn("BookID")
                .AsMap<string>("Nickname")                
                .Cascade.All();
    

    Resulting xml:

    <map cascade="all" name="FavouriteBooks" table="FavouriteBooks" mutable="true">
      <key>
        <column name="`CustomerID`" />
      </key>
      <index type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <column name="`Nickname`" />
      </index>
      <many-to-many class="Domain.Book, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
        <column name="`BookID`" />
      </many-to-many>
    </map>
    

    Generated SQL:

    create table "Customer" (
        "Id"  integer,
       "FirstName" TEXT,
       primary key ("Id")
    )
    
    create table FavouriteBooks (
        "CustomerID" INTEGER not null,
       "BookID" INTEGER not null,
       "Nickname" TEXT not null,
       primary key ("CustomerID", "Nickname")
    )
    
    create table "Book" (
        "Id"  integer,
       "Name" TEXT,
       primary key ("Id")
    )