Can';我似乎无法通过NHibernate从MySQL数据库中获取数据
因此,我设置了一个MySQL数据库,其中包含一条记录的表。我的解决方案由三个项目组成(1个域模型库、测试库和我的Web项目)。在我的MVC项目中,我用所有必要的Dll实现了NHibernate,并且 在Web项目根目录中:Can';我似乎无法通过NHibernate从MySQL数据库中获取数据,mysql,nhibernate,model-view-controller,Mysql,Nhibernate,Model View Controller,因此,我设置了一个MySQL数据库,其中包含一条记录的表。我的解决方案由三个项目组成(1个域模型库、测试库和我的Web项目)。在我的MVC项目中,我用所有必要的Dll实现了NHibernate,并且 在Web项目根目录中: nhibernate-configuration.xsd nhibernate-mapping.xsd nhibernate.config and <classname>.hbm.xml file - with the class it is mapping
nhibernate-configuration.xsd
nhibernate-mapping.xsd
nhibernate.config and
<classname>.hbm.xml file - with the class it is mapping
然后我有一个BootStrapper类,它返回当前会话:
公共静态只读ISessionFactory SessionFactory=CreateSessionFactory()
我的控制器正被我的机器人递给我一个物体
ProductController.cs
公共类产品控制器:控制器
{
私有只读IProductsRepository productsRepository
public ProductsController(IProductsRepository productsRepository)
{
this.productsRepository = productsRepository;
}
public ViewResult List()
{
return View(productsRepository.Products.ToList());
}
}
NinjectControllerFactory.cs
公共类NinjectControllerFactory:DefaultControllerFactory
{
//提供对象实例
private IKernel kernel=新的标准内核(新的DaisyblossomsServices())
}
您将销售的呼叫我的服务类DaisyblossomsServices:
公共类DaisyBlossSomsServices:NinjectModule
{
{
公共卫生产品
{
get{var session=BootStrapper.GetSession()
{
IQueryable产品{get;}
}
作为附加信息,我的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>
NHibernate.Connection.DriverConnectionProvider
NHibernate.Driver.MySqlDataDriver
真的
网状物
NHibernate.ByteCode.Castle.proxyFactory,NHibernate.ByteCode.Castle
NHibernate.dialogue.mysql5dialogue
以及Web.config的my connectionsStrings部分:
<connectionStrings>
<add name="daisyblossoms" connectionString="Server=localhost;Port=3306;Database=dbName;Uid=user;Pwd=somePSWD;pooling=false;"
providerName="MySql.Data.MySqlClient"/>
有什么想法可能是我的问题吗?请验证hibernate.cfg.xml是否已将输出设置为“更新时更新”而且你的*.hbm.xml文件被标记为嵌入式资源。这是两个最常见的错误。听起来你也在试图让很多移动部件同时工作。你可能想简化一些事情,只需要让一个控制台应用程序使用NHibernate连接到MySQL。类似如下:
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();
}
}
内部类程序{
私有静态void Main(){
var cfg=新配置();
Configure();//默认情况下使用hibernate.cfg.xml。
//Configure(“nhibernate.config”);//如果您喜欢自己的名字,可以使用此重载。
var sessionFactory=cfg.BuildSessionFactory();
使用(var session=sessionFactory.OpenSession())
使用(var tx=session.BeginTransaction()){
var query=session.CreateCriteria().List();
query.ForEach(x=>Console.WriteLine(x.Name));
tx.Commit();
}
控制台。WriteLine(“按退出…”);
Console.ReadLine();
}
}
这将允许您验证映射和配置文件是否正确,而无需同时担心MVC、Ninject等。噢,没有错误。很明显,它没有从数据库中检索任何记录来显示。很抱歉,遗漏了我的ASPX页面:我只是foreach(模型中的var产品)并显示product.Name以及product.Price.ToString(“c”),最后,如果我更改connectionString中的密码,它将出错并返回"该用户的访问被拒绝。因此,我假设它使用正确的凭据连接到数据库。问题在于它为什么不返回记录。cfg.xml是否与.config文件相同?我见过两个文件都被引用,但从未在同一个项目中出现过。如果您将配置文件命名为hibernate.cfg.xml,则当您不带任何参数调用cfg.Configure()。如果要为配置文件命名其他名称,则需要指定文件名。因此,是的,它们是相同的。
public class ProductsRepository : IProductsRepository
return session.CreateCriteria(typeof(Product)).List<Product>().AsQueryable();
}
}
public interface IProductsRepository
<?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>
<?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>
<connectionStrings>
<add name="daisyblossoms" connectionString="Server=localhost;Port=3306;Database=dbName;Uid=user;Pwd=somePSWD;pooling=false;"
providerName="MySql.Data.MySqlClient"/>
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();
}
}