Проблема с основными отношениями в Fluent NHibernate C # - PullRequest
2 голосов
/ 25 октября 2011

Я не могу найти пример по этому вопросу.Я пытаюсь получить общее представление о Fluent NHibernate, но ресурсы кажутся довольно скудными с точки зрения правильных учебных пособий.

У меня есть такой тестовый класс:

public class User
{
    public virtual long ID { get; set; }
    public virtual string Username { get; set; }
    public virtual MoreDetails ExtendedDetails { get; set; }    
}

С другим классом вродеthis:

public class MoreDetails
{
    public virtual long ID { get; set; }
    public virtual string Firstname { get; set; }
    public virtual long UserID { get; set; } // Foreign key in the DB
}

Как именно должно выглядеть мое отображение?

Как правильно выполнить запрос к БД с помощью отложенной или полной загрузки, чтобы это можно было сделать:

// user object instantiated using your provided example:
userObject.ExtendedDetails.Firstname

Я чувствую себя идиотом ... обычно я могу следить за документацией, но это очень расплывчато при таком использовании.Может кто-нибудь указать мне правильный пример (или привести)?

Я использую последнюю версию Fluent NHibernate прямо с сайта Fluent NHibernate.

С уважением,

chem

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Вот хорошая прогулка, которая поможет вам начать работу: http://dotnetslackers.com/articles/ado_net/Your-very-first-NHibernate-application-Part-1.aspx

Ваши отображения будут выглядеть примерно так.Обратите внимание, что я делаю некоторые предположения о том, как вы хотели бы генерировать свои идентификаторы вместе с типом отображения между этими объектами.

public class User
{
    public int ID { get; set; }
    public string Username { get; set; }
    public MoreDetails ExtendedDetails { get; set; }
}

public class MoreDetails
{
    public int ID { get; set; }
    public string Firstname { get; set; }
    public User User { get; set; } // Foreign key in the DB
} 

public UserMapping()
{
    Not.LazyLoad();
    Id(e => e.ID).GeneratedBy.Identity();
    Map(e => e.Username).Not.Nullable();
    HasOne(x => x.ExtendedDetails)
        .Cascade
        .SaveUpdate();
}

public MoreDetailsMapping()
{
    Not.LazyLoad();
    Id(e => e.ID).GeneratedBy.Identity();
    Map(e => e.Firstname).Not.Nullable();
    References(x => x.User).Column("UserID");
}

Для запроса ваших реляционных данных вам нужно будет открытьсеанс внутри nhibernate.Я обычно создаю помощника в соответствии с этим.

 public class NHibernateHelper
    {
        private static ISessionFactory _sessionFactory;

        private static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                    InitializeSessionFactory();

                return _sessionFactory;
            }
        }

        private static void InitializeSessionFactory()
        {
            _sessionFactory = Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2008
                              .ConnectionString(@"Server=localhost\SQLExpress;Database=SomeDB;Trusted_Connection=True;")
                              .ShowSql()
                )
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<User>())
                .BuildSessionFactory();
        }

        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }
    }

Оттуда вы можете напрямую запросить вот так:

public IQueryable<User> Users
        {
            get { return NHibernateHelper.OpenSession().Query<User>(); }
        }

Обратите внимание, что я многое из этого оставляюно, надеюсь, это поможет вам начать работу.

0 голосов
/ 25 октября 2011

Если ваш БД действительно имеет однозначное соответствие между двумя таблицами, вам нужно использовать HasOne в вашей ClassMap, например. HasOne(x => x.ExtendedDetails)

См. http://wiki.fluentnhibernate.org/Fluent_mapping для получения подробных сведений об однозначных сопоставлениях

...