gpt4 book ai didi

mysql - 似乎无法使用 NHibernate 从 MySQL DB 中获取我的数据

转载 作者:行者123 更新时间:2023-11-29 14:57:39 24 4
gpt4 key购买 nike

所以我设置了一个 MySQL 数据库,其中包含一条记录的表。我的解决方案由三个项目组成(1 个域模型库、测试库和我的 Web 项目)。在我的 MVC 项目中,我已经实现了 NHibernate 以及所有必需的 Dll,并且

在 Web 项目根目录中:

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

在我的 Global.asax.cs 文件中,我有事件处理程序来绑定(bind)当前 session : 公共(public)类 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 类返回当前 session : 公共(public)静态只读 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 正在向我的 Controller 传递一个对象产品 Controller .cs 公共(public)类ProductsController: Controller { 私有(private)只读 IProductsRepository productsRepository;

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

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

}

NinjectControllerFactory.cs 公共(public)类 NinjectControllerFactory :DefaultControllerFactory { //提供对象实例 私有(private) IKernel 内核 = new StandardKernel(new 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);
}

}

您将出售的服务称为我的服务类 DaisyblossomsServices: 公共(public)类 DaisyblossomsServices :NinjectModule {

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

}

您可以在其中看到 IProductsRepository 绑定(bind)到我的 ProductsRepository 类:

public class ProductsRepository : IProductsRepository

{ 公共(public)IQueryable产品 { 获取 { var session = BootStrapper.GetSession();

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

}
}

}

我的 ProductsController 被交给了一个 IProductsRepository 对象

 public interface IProductsRepository

{ 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>

我的connectionsStrings是Web.config的一部分:

<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();
}
}

这将允许您验证您的映射和配置文件是否正确,而不必同时担心 MVC、Ninject 等。

关于mysql - 似乎无法使用 NHibernate 从 MySQL DB 中获取我的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4169600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com