【问题标题】:Fluent NHibernate? Am I doing this correctly?流畅的NHibernate?我这样做正确吗?
【发布时间】:2011-04-13 12:20:20
【问题描述】:

我是第一次使用 Fluent NHibernate 和 NHibernate。自大约 2000 年以来,我一直在使用内部编写的自定义书面映射器。大约 2 年前切换到 LinqToSQL,大约 6 个月前切换到实体。

我想看看 Fluent/NHibernate 可以提供什么。但是,我似乎无法让它正确运行。以下是我的课程、他们的参考资料、ClassMaps 的副本。谁能告诉我这个简单的实现是否正确?

这是我的映射和对象类:

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 时使用了无效或不完整的配置。

内部异常是:

调用的目标已抛出异常。

这是处理此问题的正确方法吗?任何想法或调整将不胜感激!

【问题讨论】:

  • 我认为您缺少用户的 ClassMap。
  • 好吧,我运行良好。但是,当我实际调用它时: var allLogins = login.GetAllLogins().ToList();它引发错误:无法加载文件或程序集“NHibernate,版本=2.1.2.4000,文化=中性,PublicKeyToken=aa95f207798dfdb4”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。似乎 NHibernate.Linq 是来源?
  • Sean、NHibernate.Linq 或其他 NH 依赖库可能已针对另一个版本的 NH 进行编译。我们解决了这个问题,将其添加到 web.config:

标签: nhibernate fluent-nhibernate sessionfactory mappings


【解决方案1】:

Sean,您不能在 LoginId 上使用 GeneratedBy.Guid(),因为它是一个 int。尝试使用其他生成器或更改 LoginId 的类型。

我怀疑您不能在 UserId 上使用“私有集”,因为它是 Id。

此外,HasOne(d => d.User).ForeignKey("UserId") 意味着如果您从映射中公开数据库模型,则 FK 约束的名称将是“UserId”。在我看来,您的意图是在“用户”表上指定包含 PK 的名称列。

这些链接有更多信息:

http://wiki.fluentnhibernate.org/Fluent_mapping

http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/

one-to-one fluent nhibernate?

【讨论】:

  • 这实际上是问题所在。我的 ClassMap 和我的班级不匹配。最简单的事情花了我很多时间! :) 顺便说一句,我使用私人套装。这是因为 GeneratedBy 和 int 混淆了。再次感谢!
【解决方案2】:

您似乎忘记指定代理工厂了。可以这样做:

        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();

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多