突发奇想要在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