Search code examples
asp.net-mvcnhibernatefluent-nhibernatenhibernate-mappingfluent-nhibernate-mapping

Fluent Nhibernate Mapping for Sql Views


i am using Fluent Nhibernate in asp.net mvc3 with c#

i am working in following way to generate and map a class

Mapping

using FluentNHibernate.Mapping;
using Com.Web.Domain;

   namespace Com.Web.Mapping
      {
         public class CompanyMap : ClassMap<Company>
        {
             public CompanyMap()
            {
               Id(x => x.id);
               Map(x => x.Name);
              }
          }
       }

Class

     using System.Collections.Generic;
     using System;

      namespace Com.Web.Domain
      {

          public class Company
         {

          public virtual int id { get; set; }
          public virtual string Name{get;set}

           }

        }

and in configuration file

  private static void InitializeSessionFactory()
    {

       _sessionFactory = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                          .ConnectionString(local)

            )
            .Mappings(m =>
                      m.FluentMappings
                          .AddFromAssemblyOf<Company>())
            .ExposeConfiguration(cfg => new SchemaExport(cfg)
            .Create(false, false))  // this is intentionally set false , bcz i dont want to regenerate table when application starts every time 
            .BuildSessionFactory();


    }

now problem come i create a view in sql looks like this

Sql View

CREATE VIEW [FeaturedCompanies] AS

   SELECT COUNT(Company.id) As Count FROM Company
   WHERE Name='Alias'

i want to use this view in my code as a like i am using but how can i do that , i searched alot but found nothing on google

Pleas help me out and thanks in advance

what is tried so far

Class

public class FeaturedCompany
{
    public virtual int id { get; set; }
    public virtual int name { get; set; }
    public virtual int count { get; set; }
}

Mapping

public class FeaturedCompanyMap : ClassMap<FeaturedCompany>
  {
 public FeaturedCompanyMap()
 {
    Table("FeaturedCompanies");
    ReadOnly();
   Id(x => x.id);
   Map(x => x.name);
   Map(x => x.count);
 }
}

Solution

  • Views are mapped the same way tables are mapped except that you should put Readonly() in the mapping to prevent accidently writing to it. Example:

    public class FeaturedCompanyMap : ClassMap<FeaturedCompany>
    {
        public FeaturedCompanyMap ()
        {
           Table("FeaturedCompanies");
           ReadOnly();
    
           Id(x => x.Id);
           Map(x => x.Name);
           Map(x => x.Count);
        }
    }
    

    Update: to get the counts

    var results = session.Query<FeaturedCompany>().Where(filter).List();
    
    foreach(var row in results.Select(r => "Alias: " + r.Name + "  Occurence: " + r.Count))
    {
        // print row to screen
    }