【问题标题】:Issue with basic relationships in Fluent NHibernate C#Fluent NHibernate C#中的基本关系问题
【发布时间】:2011-10-25 02:11:04
【问题描述】:

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

问候,

化学

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这对于加载用户来说很好,但是在尝试 userObject.ExtendedDetails.Firstname 时我仍然得到 NullReference 异常。我不必映射 User 类的 ExtendedDetails 成员吗?
    • @chemicalNova 抱歉,我未能复制部分 UserMapping() 类。更新了答案。
    • 谢谢!这真的帮助了我:)
    【解决方案2】:

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

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

    【讨论】:

    • 之后我该如何使用它?所以用户需要有 HasOne 地图,MoreDetails 需要什么吗? (例如,References()?)我问的原因是因为我仍然在 ExtendedDetails 上收到 NullReferenceException。如果我只需要 User 类中的 HasOne() .. 我如何让 NHibernate 加载关系数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多