Fluent Nhibernate Many to Many relationship issue

删除回忆录丶 提交于 2019-12-25 04:22:59

问题


I have a situation where I have three tables in our database. One to contain customers, one contains customer groups, and then a table to link them together.

I am having issues where my nHibernate query wont join them correctly, and I am not sure if I am missing something.

Mapping for the Customer Groups

public CustomerGroupMapping() {
      Table("tbCustomerGroups");
      // TODO: Revisit Lazy loading
      //LazyLoad();
      Id(x => x.customerGroupId)
        .GeneratedBy.Identity()
        .Column("Customer_Group_ID");
      Map(x => x.customerGroup)
        .Column("Customer_Group")
        .Length(50);
      Map(x => x.editDisabled)
        .Column("EditDisabled")
        .Not.Nullable();

      HasManyToMany<CustomerModel>(x => x.customers)
        .Table("tbCustomerGroupsRelationship")
        .ParentKeyColumn("Customer_Group_ID")
        .ChildKeyColumn("Customer_ID")
        .Inverse();
    }

Mapping for the Customers

public CustomerMapping() {
  Table("tbCustomers");
  // TODO: Revisit Lazy load
  LazyLoad();
  Id(x => x.customerId)
    .GeneratedBy.Identity()
    .Column("Customer_ID");
  Map(x => x.customerTypeId)
    .Column("Customer_Type_ID")
    .Not.Nullable()
    .Precision(10);

  // A Customer has many users
  HasMany<UserModel>(x => x.users)
    .KeyColumn("Customer_ID");

  // A Customer can belong to many groups
  HasManyToMany<CustomerGroupModel>(x => x.groups)
    .Table("tbCustomerGroupsRelationship")
    .ParentKeyColumn("Customer_ID")
    .ChildKeyColumn("Customer_Group_ID")
    .Not.Inverse();
}

The issue seems to be that when I get a customer, I want to see that customer's groups customers. ( IE give me customer 10, get that customer group which has customer 10, and then give me all other customers in that group)

Is there a way to change these mappings to have this correctly load without generating a ton of select statements because that is what Log4net is showing me.


回答1:


What you should use is batch-fetching.

19.1.5. Using batch fetching

In a nutshell, this optimization setting will reduce lot of queries into few batches. It imporves performance and supports querying over one root entity (no need for FETCH strategies as SELECT)

Extend your class, and collection mapping with .BatchSize(xx). Classes should have this mapping:

public CustomerGroupMapping() 
{
    Table("tbCustomerGroups");
    BatchSize(25);
    ...

public CuustomerMapping() 
{
    Table("tbCustomers");
    BatchSize(25);
    ...

Collections should be extended

HasManyToMany<CustomerModel>(x => x.customers)
   ...
   .BatchSize(25)

HasManyToMany<CustomerGroupModel>(x => x.groups)
   ...
   .BatchSize(25)

Also check these for similar stuff:

  • NHibernate: Select one to Many Left Join - Take X latest from Parent
  • How to Eager Load Associations without duplication in NHibernate?
  • NHibernate QueryOver with Fetch resulting multiple sql queries and db hits

Also, my suggestion would be - do not use many-to-many. I would prefer pairing table being first level object... maybe check these:

  • How to create NHibernate HasManyToMany relation
  • many-to-many with extra columns nhibernate


来源:https://stackoverflow.com/questions/28509514/fluent-nhibernate-many-to-many-relationship-issue

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!