2011-04-13 4 views
0

Я новичок в использовании Fluent NHibernate и NHibernate в первый раз. Я использовал пользовательский письменный переводчик с 2000 года, который был написан в доме. Сделал переход на LinqToSQL около 2 лет назад и около 6 месяцев назад на Entities.Свободный NHibernate? Правильно ли я делаю это?

Хотелось бы увидеть, что может предложить 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(); 
     } 
    } 
} 

Это мой Repository:

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

Я думаю, что вам не хватает ClassMap для пользователя. – Chandu

+0

Ну, я отлично справился. Но, когда я на самом деле называю это, используйте: var allLogins = login.GetAllLogins(). ToList(); он выдает ошибку: Не удалось загрузить файл или сборку «NHibernate, Version = 2.1.2.4000, Culture = neutral, PublicKeyToken = aa95f207798dfdb4» или одну из его зависимостей. Определение манифеста размещенной сборки не соответствует ссылке на сборку. Кажется, что NHibernate.Linq является источником? – Sean

+0

Шон, NHibernate.Linq или другие NH-зависимые lib могли быть скомпилированы против другой версии NH. Мы решили эту проблему, добавив это в web.config: \t \t \t \t \t \t <имя assemblyIdentity =" "PublicKeyToken = "aa95f207798dfdb4" культура = "NHibernate нейтральный"/> \t \t \t \t \t \t AntonioR

ответ

1

Шон, вы не можете использовать GeneratedBy.Guid() на LoginID, потому что это внутр. Попробуйте использовать другой генератор или изменить тип входа.

Я подозреваю, что вы не можете использовать «частный набор» в UserId, потому что это идентификатор.

Кроме того, 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?

+0

Это было на самом деле проблема. Моя ClassMap и мой класс не соответствует. Проще всего потребовалось так много моего времени! :) I использует кстати, это был частный набор. Это было из-за GeneratedBy, и int mix. снова! – Sean

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