NHibernate SessionFactory和映射问题

时间:2011-12-24 15:56:19

标签: asp.net-mvc-3 nhibernate fluent-nhibernate nhibernate-mapping

后,在互联网上阅读到过期的文档管理会话和NHibernate /功能NHibernate的配置多小时,我居然得到了不使用XML工作的配置,我的POCO的文件和映射文件在WebProject工作,我差点激动。

然而;当我移动helper类将ISessionFactory返回到它应该进入的实际层时,没有任何效果,没有错误,我从Session Factory获得了一个ISession而没有Entites。请注意我正在使用本课程中的属性来恢复我的工厂,自我解释我知道。 在这里继续发生某种错误。 代码:

public class NhibernateSessionFactoryHelper
{
    private static ISessionFactory _sessionFactory;

    private static string _connectionString =
        ConfigurationManager.ConnectionStrings["SqlConnectionString"].ToString();
    public static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {
                _sessionFactory = BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }

    public static ISessionFactory BuildSessionFactory()
    {
        var cfg =
            Fluently.Configure().ProxyFactoryFactory(typeof(ProxyFactoryFactory).AssemblyQualifiedName).Mappings(
                m => m.FluentMappings.AddFromAssemblyOf<Category>()).Database(MsSqlConfiguration.MsSql2008.ConnectionString(_connectionString)).Cache(c => c.UseQueryCache());
        return cfg.BuildSessionFactory();

    }
}

我已经删除了所有我的Windsor容器配置,以便更轻松地进行故障排除,因此我的基本设置如下。

Web.UI ---&GT;实体(category.cs) ---&GT;映射(categoryMap.cs) ---&GT; FactoryGoo(NHibernateSessionFactory.cs

POCO / Entity的代码

public class Category {
    public Category() { }
    public virtual int CategoryID { get; set; }
    public virtual string CategoryName { get; set; }
    public virtual string CategoryDescription { get; set; }
    public virtual System.Nullable<int> ParentCategoryID { get; set; }
    public virtual System.Nullable<int> DisplayOrder { get; set; }
    public virtual int Active { get; set; }
    public virtual string DateCreated { get; set; }
    public virtual string LastUpdated { get; set; }
}

映射代码

public class CategoryMap : ClassMap<Category> {

    public CategoryMap() {
        Table("Categories");
        LazyLoad();
        Id(x => x.CategoryID).GeneratedBy.Identity().Column("CategoryID");
        Map(x => x.CategoryName).Column("CategoryName").Not.Nullable().Length(50);
        Map(x => x.CategoryDescription).Column("CategoryDescription").Not.Nullable();
        Map(x => x.ParentCategoryID).Column("ParentCategoryID");
        Map(x => x.DisplayOrder).Column("DisplayOrder");
        Map(x => x.Active).Column("Active").Not.Nullable();
        Map(x => x.DateCreated).Column("DateCreated").Not.Nullable();
        Map(x => x.LastUpdated).Column("LastUpdated").Not.Nullable();
    }
}

正如我之前所说,当所有类都存在于同一个程序集中时,我会得到我的实体和我的数据。当我将SessionFactory移动到我的SessionManagement项目或映射到Infrastructure.Data.Mappings项目和实体到Domain.Entities项目时,没有任何工作,我没有错误的原因。

感谢您阅读本文,我希望我已经发布了足够的内容供您了解设置。

2 个答案:

答案 0 :(得分:0)

确保BuildSessionFactory方法中引用的类别类引用了期望的命名空间/项目中的类别类。换句话说,不同项目中可能有多个类别类别。

答案 1 :(得分:0)

我当然不确定,但我认为您的意思是将父类别与您的类别相关联,并且属于同一类型?如果是,则使用完整的类别对象作为属性而不是categoryId,并且不使用Map()但使用流畅的References()。