Hello Everyone, 

I've been out of the Nhibernate game for 4 years and just getting back to 
it on a new project.  For the life of me I cannot get lazy loading to work 
both on collections or properties, see my model, mapping, and configuration 
attached.

I'm using AutoFac as an IoC but I don't believe that should have an 
affect.  Unless something changed from Nhibernate 3 (last version I used) 
to NHibernate 5 that I am not aware off.

Thank you for the help.

-- 
You received this message because you are subscribed to the Google Groups 
"Fluent NHibernate" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/fluent-nhibernate/4cfd8b9c-2467-4b62-bfc5-8f37d02f4354%40googlegroups.com.
using System;
using Autofac;
using Autofac.Builder;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using Microsoft.Extensions.Configuration;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
using Sa.Scheduler.Core.Domain.Mapping;

namespace Sa.Scheduler.Tests.Integration.Plumbing
{
    public class PersistenceInstaller : Autofac.Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            var cfgBuilder = new ConfigurationBuilder()
                .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
                .AddJsonFile("appsettings.json");

            var configuration = cfgBuilder.Build();
            var connectionString = configuration["ConnectionStrings:SchedulerDb"];

            builder.Register(c =>
            {
                var engine = connectionString.Contains("sql-lite") ? DatabaseEngine.SqlLite : DatabaseEngine.MsSqlServer;
                return BuildConfiguration(engine);
            }).AsSelf().SingleInstance();

            builder.Register(c => c.Resolve<Configuration>().BuildSessionFactory())
                .As<ISessionFactory>()
                .SingleInstance();
            builder.Register(x => x.Resolve<ISessionFactory>().OpenSession()).As<ISession>().SingleInstance();
        }

        protected virtual void GenerateSchema(Configuration cfg)
        {
            //new SchemaExport(cfg).Execute(true, true, false, );
        }

        private Configuration BuildConfiguration(DatabaseEngine engine)
        {
            Configuration cfg = null;
            switch (engine)
            {
                case DatabaseEngine.SqlLite:
                    cfg = SqlLiteConfiguration();
                    break;
                case DatabaseEngine.MsSqlServer:
                    cfg = SqlServerConfiguration();
                    break;

            }

            return cfg;
        }

        private Configuration SqlLiteConfiguration()
        {
            return Fluently.Configure().Database(SQLiteConfiguration.Standard.InMemory).Mappings(x =>
                {
                    x.FluentMappings.AddFromAssemblyOf<UserMapping>();
                })
                .BuildConfiguration();
        }

        private Configuration SqlServerConfiguration()
        {
            return Fluently.Configure()
                .Database(SetupSqlServerDatabase)
                .Mappings(m => { m.FluentMappings.AddFromAssemblyOf<UserMapping>(); })
                .BuildConfiguration();
        }

        protected virtual IPersistenceConfigurer SetupSqlServerDatabase()
        {
            return MsSqlConfiguration.MsSql2012
                .UseOuterJoin().ShowSql()
                .ConnectionString(x => x.Database("SaTestDb").TrustedConnection().Server("localhost"));
        }

        private enum DatabaseEngine
        {
            MsSqlServer,
            SqlLite
        }
    }
}
using FluentNHibernate.Mapping;
using Sa.Scheduler.Core.Domain.Entities;
using Sa.Scheduler.Core.Domain.Util;

namespace Sa.Scheduler.Core.Domain.Mapping
{
    public class PartnerMapping:ClassMap<Partner>
    {
        public PartnerMapping()
        {
            Table("Partner");
            Schema(ModelConstants.PartnerSchema);
            Id(e => e.PartnerId);
            Map(e => e.PartnerUid);
            Map(e => e.Name)
                .Not.Nullable()
                .Length(256);
            Map(x => x.History);
            Map(x => x.PhoneNumber).Not.Nullable();
            Map(x => x.OwnerProfile).Length(4001); // anything over 4000 is nvarchar(max)
            Map(x => x.DescriptionOfServices);
            Map(x => x.AutoConfirm).Not.Nullable();
            Map(x => x.Active);
            References(d => d.Type);
            References(x => x.Schedule).Not.Nullable();
            Map(x => x.Added).Not.Nullable();
            Map(x => x.Updated).Not.Nullable();
            Map(x => x.Deleted);
            
            HasMany(x => x.Services)
                .AsSet()
                .LazyLoad()
                .KeyColumn("Partner_id")
                .Cascade.SaveUpdate()
                .Inverse();

            HasMany(x => x.Appointments)
                .AsSet()
                .LazyLoad()
                .KeyColumn("Partner_id")
                .Cascade.SaveUpdate()
                .Inverse();
        }
    }
}
using System;
using System.Collections.Generic;

namespace Sa.Scheduler.Core.Domain.Entities
{
    public class Partner
    {
        public Partner()
        {
            Services = new HashSet<Service>();
            Appointments = new HashSet<Appointment>();
            PartnerUid = Guid.NewGuid();
        }

        public virtual int PartnerId { get; protected set; }
        public virtual Guid PartnerUid { get; set; }
        public virtual string Name { get; set; }
        public virtual string History { get; set; }
        public virtual string PhoneNumber { get; set; }
        public virtual string OwnerProfile { get; set; }
        public virtual string DescriptionOfServices { get; set; }
        public virtual bool AutoConfirm { get; set; }
        public virtual bool Active { get; set; }
        public virtual BusinessType Type { get; set; }
        public virtual PartnerSchedule Schedule { get; set; }

        public virtual DateTime Added { get; set; }
        public virtual DateTime Updated { get; set; }
        public virtual DateTime? Deleted { get; set; }


        public virtual ICollection<Service> Services { get; set; }

        public virtual ICollection<Appointment> Appointments { get; set; }
        
        public virtual void AddService(Service service)
        {
            service.Partner = this;
            service.ServiceUid = Guid.NewGuid();
            
            var now = DateTime.Now;
            service.Added = now;
            service.Updated = now;
            
            Services.Add(service);
        }
    }
}

Reply via email to