Fluent NHibernate C#中的基本关系问题

时间:2011-10-25 02:11:05

标签: c# fluent-nhibernate fluent-nhibernate-mapping

我找不到这方面的例子。我正在尝试对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
}

我的映射到底应该是什么样的?

如何使用Lazy或Eager加载正确查询数据库,以便能够执行此操作:

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

我觉得自己像个白痴..通常我可以关注文档,但这种用法非常模糊。有人能指出一个合适的例子(或给一个)吗?

我正在使用Fluent NHibernate网站上最新的Fluent NHibernate。

此致

化学

2 个答案:

答案 0 :(得分:2)

这是一个很好的演练,可以帮助您启动和运行: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>(); }
        }

请注意,我离开了很多,但希望这会帮助你起床和跑步。

答案 1 :(得分:0)

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

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