如何使用ASP.NET MVC 2实现NHibernate

vik*_*mjb 5 nhibernate asp.net-mvc asp.net-mvc-2

在过去的几天里,我一直在研究MVC应用程序。在此,我使用了几个下拉列表,并希望我做的是否是一个好的做法。我大约有5-6个下拉列表,这些下拉列表是从数据库中提取的。下拉菜单中有一个ID和描述字段。我能够使下拉列表中没有问题。但是,当我列出主表时就是出现性能问题。

所有的下拉列表选择都以整数形式存储在数据库中,因此我也具有与BaseModel(映射到HBM的类)相同的字段。当我列出数据库中的所有记录时,可以预见的是,记录中将得到一个整数。到目前为止,我还没有表现任何问题。

我想显示所选项目的描述,所以我为下拉菜单创建一个模型类,并在模型中有一个方法,该方法将与数据库对话并根据选择获得描述。问题是这正在减慢页面加载速度。我想知道是否需要进行设计更改以更快地加载它。以下是我的代码

MasterList1表(州和县是此表中的整数)状态下拉列表(主表具有所有州的ID)县下拉列表(主表具有所有县的ID)

Nhibernate的BaseModel类

MasterList1州县

型号类别

MasterList1Model StateModel县模型

存储库类MasterList1Repo国家Repo县Repo

查看MasterList1

在视图中,我正在BaseModel类中调用字符串属性。在该属性中,我要调用Model类,而后者又要调用Repo以获取字符串。这是Repo类中的方法。

        public ApplicationTypeMaster GetByID(int ID)
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            return session.Get<ApplicationTypeMaster>(ID);
        } 
    }

    public string GetApplicationTypeByID(int ID)
    {
        return GetByID(ID).ApplicationTypeDescription.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

我不确定如何改善这一点。有什么建议么 ?

Fel*_*ani 2

你知道ViewModel方法吗?它是一个类,代表视图需要显示的内容。您可以使用您需要的这些属性创建一个 ViewModel 类,并使用该类键入您的视图,用 NHibernate 填充它,然后显示它,例如:

public class ApplicationTypeMasterViewModel
{
   public int Id { get; set; }
   public string Name { get; set; }
   public string CityName { get; set; }
   public string StateName { get; set; }

   // other properties you need

   public ApplicationTypeMasterViewModel() { }   
}
Run Code Online (Sandbox Code Playgroud)

在你的服务层,尝试这样的事情:

public ApplicationTypeMasterViewModel GetByID(int ID)
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            return session.Query<ApplicationTypeMaster>()
                            .Fetch(x => x.City).ThenFetch(c => c.State)
                            .Where(x => x.Id == ID)
                            .Select(x => new ApplicationTypeMasterViewModel() { 
                                                    Id = x.Id, 
                                                    Name = x.Name, 
                                                    CityName = x.City.Name, 
                                                    StateName = x.City.State.Name
                                                    // other properties you need
                                            })
                            .FirstOrDefault();
        } 
    }
Run Code Online (Sandbox Code Playgroud)

您可以使用列表或单个对象来完成此操作。

在控制器中,您调用此方法并将 ViewModel 传递给您的 View 并渲染它:

<p>
    <label>Name: </labe>
    <%: Model.Name %>
</p>

<p>
    <label>City: </labe>
    <%: Model.CityName %>
</p>


<p>
    <label>State: </labe>
    <%: Model.StateName %>
</p>
Run Code Online (Sandbox Code Playgroud)