・・・では、「System.Data.Services.dll」があれば動くの?ということで Windows から拝借して、試してみた。
NHibernate.Linq ソース資源を svn checkout し、
$ svn co https://nhcontrib.svn.sourceforge.net/svnroot/nhcontrib/trunk/
MonoDevelop で NHibernate.Linq.sln を開いて、参照の修正(System.Data.Services)後、NHibernate.Linq をビルド。
試してみたコードはこれ。
using System;
using System.Linq;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Linq;
namespace NHibernateExample
{
public class Product
{
int _id;
string _name;
decimal? _price;
string _description;
public virtual int Id
{
get { return _id; }
set { _id = value; }
}
public virtual string Name
{
get { return _name; }
set { _name = value; }
}
public virtual decimal? Price
{
get { return _price; }
set { _price = value; }
}
public virtual string Description
{
get { return _description; }
set { _description = value; }
}
public override string ToString()
{
return "ID:" + _id + " NAME:" + _name + " PRICE:" + _price + " DESCRIPTION:" + _description;
}
}
class Program
{
static void Main(string[] args)
{
Configuration cfg = new Configuration();
cfg.Configure("SQLServer.cfg.xml");
ISessionFactory factory = cfg.BuildSessionFactory();
using (ISession session = factory.OpenSession())
{
var results = from p in session.Linq<Product>()
orderby p.Id
select p;
foreach (Product p in results)
{
Console.WriteLine(p);
}
}
}
}
}
/*
* Build:
*
* gmcs -r:NHibernate.dll,NHibernate.Linq.dll l2nh.cs
*
* Run:
*
* mono l2nh.exe
*
*/
コンフィグファイル(SQLServer.cfg.xml)<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernateExample">
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
Data Source=192.168.1.*,49174;
Initial Catalog=TestData;
User ID=sta;
Password=passw0rd;
Trusted_Connection=False
</property>
<property name="adonet.batch_size">0</property>
<property name="show_sql">false</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="use_outer_join">true</property>
<property name="command_timeout">60</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
<mapping file="Product.hbm.xml" />
</session-factory>
</hibernate-configuration>
マッピングファイル(Product.hbm.xml)<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="l2nh"
namespace="NHibernateExample">
<class name="Product" table="Products">
<id name="Id" column="ProductID">
<generator class="assigned" />
</id>
<property name="Name" column="ProductName" not-null="true" />
<property name="Price" column="Price" />
<property name="Description" column="ProductDescription" />
</class>
</hibernate-mapping>
実行(事前に NHibernate.Linq.dll、System.Data.Services.dll を MONO_PATH で設定してるディレクトリにコピー)。$ gmcs -r:NHibernate.dll,NHibernate.Linq.dll l2nh.cs $ mono l2nh.exe ID:0 NAME:SQL Server PRICE: DESCRIPTION:SQLServer 2008 Express Edition ID:1 NAME:Clamp PRICE:12.4800 DESCRIPTION:Workbench clamp ID:50 NAME:Flat Head Screwdriver PRICE:3.1700 DESCRIPTION:Flat head ID:75 NAME:Tire Bar PRICE: DESCRIPTION:Tool for changing tires. ID:3000 NAME:3mm Bracket PRICE:0.5200 DESCRIPTION:
うーむ、あっさりうまくいった。
NHibernate.Linq のビルドすら無警告で完了というくらい、無問題で試すことができたが、LINQ TO SQL と同様に、うまくいったとは言えない。
ただ、Windows から持ってきたアセンブリをそのまま使用してうまく動くということ自体、それはそれですごいことだよなと思う(当たり前すぎ?)。
それほどの基盤はあるが、あと一歩のところで、NotImplementedException をスローしたり、アセンブリそのものがなかったりと、らしいといえば、らしい。
今後、こういった Mono では未実装のアセンブリを Windows から持ってきて使用することに、実際どれくらいの障壁があるのか、また、案外そういった障壁が取り除かれて、使用無問題となったら、Mono が実装をカバーする領域って限定されたりするのかな。


0 件のコメント:
コメントを投稿