Не могу вывести мои данные из БД MySQL с помощью NHibernate

0

Итак, у меня установлена ​​база данных MySQL с таблицей с одной записью. Мое решение состоит из трех проектов (1 библиотека модели домена, тестовая библиотека и мой веб-проект). В моем проекте MVC я внедрил NHibernate со всеми необходимыми DLL и

В корне веб-проекта:

nhibernate-configuration.xsd
nhibernate-mapping.xsd
nhibernate.config and 
<classname>.hbm.xml file - with the class it is mapping

В моем файле Global.asax.cs у меня есть обработчики событий для привязки текущего сеанса:    открытый класс MvcApplication: System.Web.HttpApplication {

public MvcApplication()
{
  BeginRequest += (MvcApplication_BeginRequest);
  EndRequest += (MvcApplication_EndRequest);
}

void MvcApplication_BeginRequest(object sender, EventArgs e)
{
  CurrentSessionContext.Bind(BootStrapper.SessionFactory.OpenSession());
}

void MvcApplication_EndRequest(object sender, EventArgs e)
{
  CurrentSessionContext.Unbind(BootStrapper.SessionFactory).Dispose();
}

Затем у меня есть мой класс BootStrapper, который возвращает текущий сеанс:   public static readonly ISessionFactory SessionFactory = CreateSessionFactory();

  private static ISessionFactory CreateSessionFactory()
  {
    var cfg = new Configuration().Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "nhibernate.config"));
    cfg.SetProperty(NHibernate.Cfg.Environment.ConnectionStringName, System.Environment.MachineName);
    return cfg.BuildSessionFactory();
  }

  public static ISession GetSession()
  {
    return SessionFactory.GetCurrentSession();
  }

Мой контроллер получает объект от моего Ninject IoC ProductController.cs    public class ProductsController: Контроллер   {       частное readonly IProductsRepository productsRepository;

    public ProductsController(IProductsRepository productsRepository)
    {
      this.productsRepository = productsRepository;
    }

    public ViewResult List()
    {
        return View(productsRepository.Products.ToList());
    }

}

NinjectControllerFactory.cs   Открытый класс NinjectControllerFactory: DefaultControllerFactory {   // Присвоение экземпляров объектов   private IKernel kernel = new StandardKernel (новый DaisyblossomsServices());

//MVC calls this to get the controller for each requests
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
  if (controllerType == null)
    return null;
  return (Controller)kernel.Get(controllerType);
}

}

Которое вы будете продавать звонки моим услугам класса DaisyblossomsУслуги:   открытый класс DaisyblossomsServices: NinjectModule {

public override void Load()
{
    Bind<IProductsRepository>().To<ProductsRepository>();
}

}

Где вы можете видеть, что IProductsRepository привязан к классу ProductRepository:

public class ProductsRepository : IProductsRepository

{   публичные продукты IQueryable   {       get {var session = BootStrapper.GetSession();

    return session.CreateCriteria(typeof(Product)).List<Product> ().AsQueryable();

    }
}

}

И моим ProductsController передается объект IProductsRepository

 public interface IProductsRepository

{   IQueryable Products {get; } }

Как дополнительная информация Файл My Product.hbm.xml, который отображает мой класс Product.cs

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Daisyblossoms.Domain"
                   namespace="Daisyblossoms">
      <class name="Product"
         table="product">
    <id name="ProductID">
      <generator class="assigned" />
    </id>
    <property name="Name" column="Name" />
    <property name="Price" column="Price" />
  </class>
</hibernate-mapping>

И мой nhibernate.config:

<?xml version="1.0"?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory name="Daisyblossoms.Domain">
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
    <property name="generate_statistics">true</property>
    <property name="current_session_context_class">web</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory,     NHibernate.ByteCode.Castle</property>
    <property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
    <mapping assembly="Daisyblossoms.WebUI"/>
  </session-factory>
</hibernate-configuration>

И мои соединения фиксируют часть Web.config:

<connectionStrings>
<add name="daisyblossoms" connectionString="Server=localhost;Port=3306;Database=dbName;Uid=user;Pwd=somePSWD;pooling=false;" 
 providerName="MySql.Data.MySqlClient"/>

Любые мысли, что может быть моей проблемой?

  • 0
    Ох, и без ошибок. Очевидно, что он не получает никаких записей из БД для отображения.
  • 0
    Извините, пропустил мою ASPX-страницу: я просто использую foreach (var product в Model) и отображаю product.Name, а также Product.Price.ToString ("c")
Показать ещё 1 комментарий
Теги:
model-view-controller
nhibernate

1 ответ

1
Лучший ответ

Убедитесь, что в файле hibernate.cfg.xml установлено значение "Обновить, если новый", и что ваши файлы *.hbm.xml помечены как встроенные ресурсы. Это две самые распространенные ошибки. Это также звучит так, будто вы пытаетесь заставить много движущихся частей работать одновременно. Возможно, вам захочется упростить все, чтобы просто получить консольное приложение для подключения к MySQL с помощью NHibernate. Что-то вроде этого:

internal class Program {
    private static void Main() {
        var cfg = new Configuration();
        cfg.Configure();  // Uses hibernate.cfg.xml by default.
        // cfg.Configure("nhibernate.config");  // Or use this overload if you prefer your own name.
        var sessionFactory = cfg.BuildSessionFactory();
        using(var session = sessionFactory.OpenSession())
        using(var tx = session.BeginTransaction()) {
            var query = session.CreateCriteria<Product>().List();
            query.ForEach(x => Console.WriteLine(x.Name));
            tx.Commit();
        }
        Console.WriteLine("Press <ENTER> to exit...");
        Console.ReadLine();
    }
}

Это позволит вам убедиться, что ваши сопоставления и файлы конфигурации верны, не беспокоясь о MVC, Ninject и т.д. в то же время.

  • 0
    Является ли файл cfg.xml тем же, что и файл .config? Я видел обе ссылки, но никогда в одном проекте?
  • 0
    Если вы называете свой конфигурационный файл hibernate.cfg.xml, NHibernate загружает его автоматически при вызове cfg.Configure () без каких-либо аргументов. Если вы хотите назвать свой конфигурационный файл как-нибудь еще, вам нужно указать имя файла. Так что да, это одно и то же.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню