2011-04-13 65 views
0

我是新来使用功能NHibernate和NHibernate的第一次。自从2000年开始,我使用了自定义的写入映射器。大约两年前,大约6个月前转换为LinqToSQL实体。流利的NHibernate?我是否正确地做这件事?

我想看看有什么流利/ 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时使用了无效或不完整的配置。

的内部异常是:

异常已被调用的目标抛出。

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

+0

我认为你缺少用户类映射。 – Chandu 2011-04-13 03:38:16

+0

嗯,我运行得很好。但是,当我用实际叫它:VAR allLogins = login.GetAllLogins()ToList();它会抛出一个错误:无法加载文件或程序集'NHibernate,Version = 2.1.2.4000,Culture = neutral,PublicKeyToken = aa95f207798dfdb4'或其依赖项之一。定位的程序集清单定义与程序集引用不匹配。看起来像NHibernate.Linq是源? – Sean 2011-04-13 06:20:47

+0

肖恩,NHibernate.Linq或其他NH依赖库可能已被编译为另一版本的NH。我们解决了这个问题加入这web.config中: \t \t \t \t \t \t \t \t \t \t \t \t AntonioR 2011-04-14 02:08:40

回答

1

肖恩,你不能登录ID使用GeneratedBy.Guid(),因为它是一个int。尝试使用另一个生成器或更改LoginId的类型。

我怀疑,因为它的编号,你不能用“私订”的用户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/

one-to-one fluent nhibernate?

+0

这实际上是问题。我的类映射和我的课不匹配。最简单的事情了我的时间这么多!:)我的用途顺便说一下,私人设置是正确的,这是因为GeneratedBy和int混合在一起,谢谢再来一次! – Sean 2011-04-13 05:49:08

0

看来你忘了指定代理工厂。这是可以做到这样的:

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