关于Fluent NHibernate c#中基本关系的问题

本文关键字:关系 问题 Fluent NHibernate 关于 | 更新日期: 2023-09-27 18:12:11

我找不到这方面的例子。我试图对Fluent NHibernate有一个基本的了解,但是在适当的教程方面,资源似乎相当稀缺。

我有一个这样的测试类:

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

与另一个类像这样:

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网站。

问候,

化学

关于Fluent NHibernate c#中基本关系的问题

下面是一个很好的入门指南,可以帮助您启动和运行: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>(); }
        }

注意,我在这里省略了很多内容,但希望这能帮助你开始和运行。

如果你的db确实有两个表之间的一对一映射,你需要在你的ClassMap中使用HasOne,例如HasOne(x => x.ExtendedDetails)

有关一对一映射的详细信息,请参阅http://wiki.fluentnhibernate.org/Fluent_mapping