功能NHibernate? 我在做正确吗?(Fluent NHibernate? Am I do

2019-10-29 06:25发布

我是新来使用功能NHibernate和NHibernate的第一次。 因为这是写在房子约2000我用一个自定义的书面映射。 使得转而使用LinqToSQL大约2年前,大约6个月前的实体。

我想看看有什么流利/ 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()它抛出以下错误:

在创建会话工厂使用了无效的或不完整的结构。

的内部异常是:

异常已通过调用的目标引发异常。

这是解决这个正确的方法是什么? 任何意见或调整,将不胜感激!

Answer 1:

肖恩,你不能登录ID,因为它是一个int使用GeneratedBy.Guid()。 尝试使用其他发电机或改变登录ID的类型。

我怀疑,因为它的编号,你不能用“私订”的用户ID。

此外,HasOne(d => d.User).ForeignKey(“用户ID”),也就是说,如果你从你的映射暴露你的数据库模型中,FK约束的名称将是“用户ID”。 在我看来,你的目的是要指定名称列持有表“用户”的PK。

这些链接有更多的相关信息:

http://wiki.fluentnhibernate.org/Fluent_mapping

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

一到一个连贯NHibernate?



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


文章来源: Fluent NHibernate? Am I doing this correctly?