mono下使用Nhibernate

2 篇文章 0 订阅

突发奇想要在mac下写ASP.NET, 选择了mono之后出了一堆的问题。

昨天尝试使用Sqlite作为数据库结果花费了大量的时间一致没有找明白该如何解决,今天尝试连接mysql终于成功了。这里简单回顾下如何使用NHibernate操作mysql数据库。


把能注意到的问题在这里总结一下。

明后天的任务是学习c#语法,熟悉ASP.NET 的机制,学习NHibernate操作数据库。


1.新建一个空的控制台solution。 mono有很好的机制管理package以及reference。右击packages文件夹,选择add packages。添加MySql.Date 以及 NHibernate。




之后添加reference。我的项目里需要引入如下内容:


必须的有:

 

可能需要引入的:

这些包可以通过搜索框检索到。


2. 接着在项目下创建nhiberante的配置文件:


接着修改hibernate.cfg.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
 <!-- an ISessionFactory instance -->
 <session-factory>
  <!-- properties -->
  <property name="connection.provider">
    NHibernate.Connection.DriverConnectionProvider
  </property> 
  <property name="connection.driver_class">
    NHibernate.Driver.MySqlDataDriver
  </property> 
  <property name="connection.connection_string">
    <!-- Found from http://www.connectionstrings.com/mysql; note that the 'dev' and 'test_password' 
    match the user we created, and 'products' matches the Database -->
Server=localhost;Database=TestProduct;Uid=root;Pwd=root;
  </property>

  <!-- Will automatically create a fresh table each time we create an ISessionFactory object -->
  <!---<property name="hbm2ddl.auto">create-drop</property>-->

  <property name="dialect">

    NHibernate.Dialect.MySQLDialect
  </property>
  <property name="show_sql">true</property>

  <property name="proxyfactory.factory_class">NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate</property>  

  <!---<mapping assembly="NHibernateDemo.Domain"/>-->

 </session-factory>
</hibernate-configuration>

其中 connection.connection_string按照自己的服务器地址,数据库名,用户密码配置。

有一个配置问题,网上查过发现是NHibernate 3.2以上的版本会报错, proxyfactory.factory_class 这里按照我这样配就可以了。然后右击hibernate.cfg.xml,选择property, 修改如下图两个地方:




3. 至此NHibernate就算是配好了。用一个例子跑一下。


创建一个Product类

using System;

namespace NHibernateDemo.Domain
{
	public class Domain
	{
		public Domain ()
		{
		}
	}
	public class Product
	{
		public virtual int Id {  get;  set; }
		public virtual string Name {  get;   set; }
		public virtual string Category {  get;  set; }
		public virtual bool Discontinued {  get;  set; }
	}
}

这里要在成员变量 前加virtual 修饰词,目前也不清楚是为什么,运行的时候一直提示要加上。

然后,在项目下新建Mapping文件夹,创建Product.hbm.xml配置文件,配置如下:


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="NHibernateDemo" 
       namespace="NHibernateDemo.Domain">
  
  <class name="Product">
	 <id name="Id">
   	 	<generator class="increment" />
     <span style="white-space:pre">	</span> </id>
	 <property name="Name" />
	 <property name="Category" />
	 <property name="Discontinued" />
  </class>
  
</hibernate-mapping>

这个配置可以在网上搜索相关博客。xml文件可能都需要按照像hibernate.dfg.xml那样去设置属性,这里不是很肯定,我都加了。

4. 然后在mysql对应数据库创建响应的表,比如如下图:


然后用如下代码跑:测试通过。

using System;
using System.Collections.Generic;
using NHibernate;
using NHibernateDemo.Domain;
using NHibernate.Tool.hbm2ddl;

namespace NHibernateTest
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			IList<Product> products;

			// Don't need to use schema export because of the hbm2dll property.
			var cfg = new NHibernate.Cfg.Configuration();
			cfg.Configure("hibernate.cfg.xml");
			// ensure that mapping hbm.xml file is loaded

			cfg.AddAssembly(typeof(MainClass).Assembly);
			//manually add configuration
//			cfg.SetProperty("dialect", "NHibernate.Dialect.MySQLDialect");
//			cfg.SetProperty("connection.driver_class", "NHibernate.Driver.MySqlDataDriver");
//			cfg.SetProperty("connection.connection_string", "Server=localhost;Database=TestProduct;User ID=root;Password=root;CharSet=utf8");
//			cfg.SetProperty("proxyfactory.factory_class", "NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate");  
//			cfg.AddAssembly("NHibernateDemo");  
			//cfg.SetDefaultAssembly ("NHibernateDemo.Domain");
			Product p = new Product() {Name="Captains of Crush Gripper #1 fuck", Category="fitness" };

			ISessionFactory factory =cfg.BuildSessionFactory();
			using (ISession session = factory.OpenSession())
			{
				session.Save(p);
				session.Flush();
				ICriteria sc = session.CreateCriteria<Product>();
				products = (List<Product>)sc.List<Product>();
				Console.WriteLine(products[0].Name);
				session.Close();
			}
			factory.Close();

			Console.WriteLine( 
				products.Count );

			Console.WriteLine ("Hello World!");
		}
	}
}

以后的任务是学习NHibernate的语法,这样会比直接操作mysql简化许多。


光这个部分我搞了有一个下午,也仅仅才是刚刚起步而已,明天还要尝试ASP.NET连接mysql数据库,因为有了NHibernate系统版本的因素似乎小了那么一点(但是VS 用的是自带的数据库,可能也不用NHibernate)。

其中我觉得很重要的一点是,查资料真的很关键。虽然说百度搜索有时候很难搜索到有用信息,但是有的时候可以很快的解决一些细节问题。平时,我还是会尝试用谷歌, 一般stackoverflow会有比较切题的解决方案,当然官方文档同样也很重要,尤其是网上的博客没有更新到软件的对应版本的时候。 


测试项目代码:http://pan.baidu.com/s/1sjT1IA5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值