1

我有这个映射(它来自 Adventureworks,因为我在演示应用程序中使用它来进行自动分页收集)

ModelMapper mapper = new ModelMapper(new SimpleModelInspector());

            mapper.Class<Contact>(
                k => { 
                    k.Id(i => i.ContactID, m => m.Generator(Generators.Native));
                    k.Schema("Person");
                } 
                );
            mapper.Class<Employee>(
                k => 
                {
                    k.Id(i => i.EmployeeID, m => m.Generator(Generators.Native));
                    k.Schema("HumanResources");
                    k.ManyToOne(c => c.Contact, m =>  m.Column("ContactID"));
                }
                );
            mapper.Class<SalesOrderHeader>(
                k =>
                {
                    k.Id(i => i.SalesOrderID,m=>m.Generator(Generators.Native));
                    k.Schema("Sales");
                    k.ManyToOne(c => c.SalesPerson, m => m.Column("SalesPersonID"));
                    k.ManyToOne(c => c.Contact, m => m.Column("ContactID"));
                }
                );

            var map = mapper.CompileMappingForAllExplicitlyAddedEntities();
            cfg.AddDeserializedMapping(map,string.Empty);

以及以下(有限)查询:

var list = NHHelper.Instance.CurrentSession.Query<SalesOrderHeader>()
                            .Fetch(k => k.Contact)
                            .Fetch(k => k.SalesPerson)
                            .Skip(first)
                            .Take(count)
                            .ToList();

员工联系导致的select N+1无法删除,怎么办?考虑映射也可以更改!

EDIT:我通过@cremor 添加了工作解决方案

 var list = NHHelper.Instance.CurrentSession.Query<SalesOrderHeader>()
                            .Fetch(k => k.Contact)
                            .Fetch(k => k.SalesPerson).ThenFetch(k=>k.Contact)
                            .Skip(first)
                            .Take(count)
                            .ToList();

这将避免这个问题。

4

1 回答 1

4

添加.ThenFetch(c => c.Contact)after也应该.Fetch(k => k.SalesPerson)获取Contact.Employee

于 2011-10-14T07:16:32.767 回答