2

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

问候,

化学

4

2 回答 2

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

请注意,我在这里留下了很多内容,但希望这将有助于您启动和运行。

于 2011-10-25T03:59:34.700 回答
0

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

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

于 2011-10-25T02:35:32.377 回答