Свободный NHibernate? Я делаю это правильно? - PullRequest
0 голосов
/ 13 апреля 2011

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

Я бы хотел посмотреть, что 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 использовалась неверная или неполная конфигурация.

Внутреннее исключение:

Исключение было сгенерировано целью вызова.

Это правильный способ подойти к этому? Любые идеи или настройки будут с благодарностью!

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Шон, вы не можете использовать GeneratedBy.Guid () для LoginId, потому что это 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/

один-к-одному свободно владеет nhibernate?

0 голосов
/ 13 апреля 2011

Кажется, вы забыли указать фабрику прокси.Это можно сделать так:

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