流利的NHibernate?我这样做正确吗?

| 我是第一次使用Fluent NHibernate和NHibernate。自2000年以来,我一直使用内部编写的自定义书面映射器。大约2年前改用LinqToSQL,大约6个月前改用Entities。 我想看看Fluent / NHibernate提供什么。但是,我似乎无法使其正常运行。以下是我的类,它们的引用和ClassMap的副本。有人可以告诉我这个简单的实现是否正确? 这是我的映射和对象类:
using System;

using FluentNHibernate.Mapping;

namespace MyData.Data.Mappings
{
    public class Login
    {
        public virtual int LoginId { get; private set; }
        public virtual string Username { get; set; }
        public virtual User User { get; set; }
    }

    public class LoginClassMap : ClassMap<Login>
    {
        public LoginClassMap()
        {
                Table(\"Logins\");

                Id(d => d.LoginId).GeneratedBy.Guid();
                Map(d => d.Username).Not.Nullable().Length(50);

                HasOne(d => d.User).ForeignKey(\"UserId\").Cascade.All();
         }
    }

    public class User
    {
        public virtual Guid UserId{ get; private set; }
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
        public virtual Login Login { get; set; }
    }

    public class UserClassMap : ClassMap<User>
    {
        public UserClassMap()
        {
            Table(\"Users\");

            Id(d => d.UserId).GeneratedBy.Guid();
            Map(d => d.FirstName).Not.Nullable().Length(100);
            Map(d => d.LastName).Not.Nullable().Length(100);

            References(r => r.Login, \"UserId\").Not.Nullable();
        }
    }
}
这是我的存储库:
using System;
using System.Linq;

using NHibernate;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate.Linq;

using MyData.Data.Mappings;

namespace MyData.Data.Repository
{
    public class LoginRepository
    {
        private readonly ISessionFactory _sessionFactory;
        ISession _session;

        public LoginRepository()
        {
            _sessionFactory = this.CreateSessionFactory();

            _session = _sessionFactory.OpenSession();
        }

        private ISessionFactory CreateSessionFactory()
        {
            string connString = \"MyDataConnectionString\";


        FluentConfiguration config = Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2005.ConnectionString(
           x => x.FromConnectionStringWithKey(connString)))
        .ExposeConfiguration(
            c => c.SetProperty(\"current_session_context_class\", \"webContext\"))
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Login>());

            return config.BuildSessionFactory();
        }

        public IQueryable<Login> GetAllLogins()
        {
            return _session.Linq<Login>();
        }
    }
}
每当到达config.BuildSessionFactory()时,都会引发以下错误: 创建SessionFactory时使用了无效或不完整的配置。 内部异常是: 调用的目标已引发异常。 这是解决这个问题的正确方法吗?任何想法或调整将不胜感激!     
已邀请:
肖恩,您不能在LoginId上使用GeneratedBy.Guid(),因为它是一个int。尝试使用其他生成器或更改LoginId的类型。 我怀疑您不能在UserId上使用\“ private set \”,因为它是ID。 同样,HasOne(d => d.User).ForeignKey(\“ UserId \”)意味着,如果从映射中公开数据库模型,则FK约束的名称将为\“ UserId \”。在我看来,您的意图是指定保存表\“ Users \”上的PK的名称列。 这些链接具有更多信息: http://wiki.fluentnhibernate.org/Fluent_mapping http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/ 一对一流利的冬眠?     
看来您忘记了指定代理工厂。可以这样完成:
        OracleDataClientConfiguration persistenceConfigurer = OracleDataClientConfiguration
            .Oracle10
            .ConnectionString(connectionStringBuilder => connectionStringBuilder.FromAppSetting(\"Main.ConnectionString\"))
            .ProxyFactoryFactory<ProxyFactoryFactory>()
            .CurrentSessionContext<ThreadStaticSessionContext>()
            .AdoNetBatchSize(25)
            .DoNot.ShowSql();

        FluentConfiguration cfg = Fluently.Configure()
            .Database(persistenceConfigurer)
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>());

        return cfg.BuildConfiguration();
    

要回复问题请先登录注册