我找不到这方面的例子。我正在尝试对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。
此致
化学
答案 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