Я новичок в использовании 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 использовалась недопустимая или неполная конфигурация.
Внутреннее Исключение:
Исключения было брошено в адресат вызова.
Правильно ли это подходит? Любые идеи или хитрости были бы высоко оценены!
Я думаю, что вам не хватает ClassMap для пользователя. – Chandu
Ну, я отлично справился. Но, когда я на самом деле называю это, используйте: var allLogins = login.GetAllLogins(). ToList(); он выдает ошибку: Не удалось загрузить файл или сборку «NHibernate, Version = 2.1.2.4000, Culture = neutral, PublicKeyToken = aa95f207798dfdb4» или одну из его зависимостей. Определение манифеста размещенной сборки не соответствует ссылке на сборку. Кажется, что NHibernate.Linq является источником? – Sean
Шон, NHibernate.Linq или другие NH-зависимые lib могли быть скомпилированы против другой версии NH. Мы решили эту проблему, добавив это в web.config: \t \t \t \t \t \t <имя assemblyIdentity =" "PublicKeyToken = "aa95f207798dfdb4" культура = "NHibernate нейтральный"/> \t \t \t \t \t dependentAssembly> \t assemblyBinding> –
AntonioR