ãã®ãããã¯ã§ã¯ã
Oracleãšå
±ã«
Fluent NHibernateã©ã€ãã©ãªã匷調ããå°ããªäŸãæããããšæã
ãŸã ã çŸåšããã®ãããã¯ã«é¢ããèšäºã¯ã»ãšãã©ãªãïŒ
ããã«é¢ããèšåïŒãOracleãšã®çžäºäœçšã®èª¬æã¯ããã«å°ãªããªã£ãŠããŸãã åœç¶ãã»ãšãã©ã¯ãã·ã¢èªã§ã¯ãããŸããã ãã ããã©ã€ãã©ãªã«ã¯æ³šæãå¿
èŠã§ãã
èè
ã¯ãXMLã®
NHibernateãåãé€ããšããã¿ã¹ã¯ãèšå®ããŸããïŒããã°xmllessïŒã ãããã£ãŠãç§ãã¡ã®ãããžã§ã¯ãã§ã¯ããã§ã¯ãããŸããã 絶察ã«ã 代ããã«ãã©ã ãåŒãšã¡ãœãããã§ãŒã³ã䜿çšããŠããŒã¿ããŒã¹ã調æŽãããšã³ãã£ãã£ãããããããæµïŒãªïŒ "fluid"ãŸã㯠"flexible"ïŒã€ã³ã¿ãŒãã§ã€ã¹ãæäŸãããŸãã
å¿
èŠæ¡ä»¶
å¿
èŠãªãã®ïŒ
- OracleãµãŒããŒïŒç§ã®å Žåã¯11.2.0.1.0ïŒ
- Oracle DACïŒç§ã®å Žåã¯11.2.0.2.1ïŒãOracle ClientããŸãã¯OracleããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ã®ãã®ä»ã®ãããã€ããŒã
å°æ¥ã®åé¡ãåé¿ããã«ã¯ããµãŒãããŒãã£ã®ãŠãŒãã£ãªãã£ãªã©ã䜿çšããŠããŒã¿ããŒã¹ã«æ¥ç¶ã§ããããšã確èªããŠãã ããã ã¯ã©ã€ã¢ã³ãèšå®ã¯æ¬¡ã®å Žæã«ãããŸãã
%Oracle DAC/Client%\product\11.2.0\client_1\Network\Admin\tnsnames.ora
ç§ã®å Žåããã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = orasrvxp)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
ãããžã§ã¯ããäœæãã
Visual Studio 2010ã§æ°ããã³ã³ãœãŒã«ãããžã§ã¯ããäœæããFluentExampleãšããååãä»ããŸãã NuGet Package Managerã䜿çšããŠãå¿
èŠãªããã±ãŒãžããã°ããèŠã€ããåãåããã€ã³ã¹ããŒã«ããŸãã ã©ã€ãã©ãªã
æåã§ã€ã³ã¹ããŒã«ããããšãã§ããŸãã
ãããžã§ã¯ããã¡ã€ã«ãå³ã¯ãªãã¯ãã[ã©ã€ãã©ãªããã±ãŒãžåç
§ã®è¿œå ...]ãã¯ãªãã¯ããŸãã æ€çŽ¢ãã£ãŒã«ãã®[ãªã³ã©ã€ã³]ã¿ãã§ããfluentããšå
¥åããŸãã

Fluent NHibernateèªäœã«å ããŠããã¹ãŠã®äŸåé¢ä¿ãããŒããããŸãïŒCastle.CoreãIesi.CollectionsãNHibernateãNHibernate.CastleïŒã
ç§ã¯
ã峿žé€šã®
ãŠã§ããµã€ãã®ãã€ãã£ããª
äŸã«åºã¥ããŠ
ã峿žé€šã®æ©èœãç°¡åãã€ååã«èª¬æããŸãã ã¹ããŒã ã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã

ãããžã§ã¯ãã§ã2ã€ã®ãµããã©ã«ããŒãäœæããŸãïŒãšã³ãã£ãã£ãŒãšãããã³ã°ãããã«ãšã³ãã£ãã£ãŒãšããã«å¿ãããããã³ã°ãé
眮ãããŸãã
ãšã³ãã£ãã£ã®èª¬æ
æåã®ãšã³ãã£ãã£ãåŸæ¥å¡ã åŸæ¥å¡ã«ã¯ãååãå§ãããã³è·å ŽããããŸããåºã§ãã ãšã³ãã£ãã£ãã©ã«ããŒã§ã次ã®ã³ãŒãã䜿çšããŠæ°ããã¯ã©ã¹ã远å ããŸãã
public class Employee
{
public virtual int Id { get ; private set ; }
public virtual string FirstName { get ; set ; }
public virtual string LastName { get ; set ; }
public virtual Store Store { get ; set ; }
}
* This source code was highlighted with Source Code Highlighter .
次ã®2ã€ã®ç¹ã«æ³šç®ããŠãã ããã
- 以éã
Id
ããããã£ãš1 Id
ãªã¹ãããããã£ã¯ããã©ã€ããŒãã»ãã¿ãŒã§å®£èšãããŸãã NHibernateã®ã¿ãïŒãªãã¬ã¯ã·ã§ã³ãä»ããŠïŒ Id
ã®å€ãèšå®ããã³ã³ã¹ãã©ã¯ã¿ãŒã§ãªã¹ããåæåããŸãã - NHibernateã¯ãšã³ãã£ãã£ã®ãããã·ã¯ã©ã¹ãäœæããããããã¹ãŠã®ããããã£ã¯
virtual
修食åã§å®£èšãããŸããããããã£ã®ãªãŒããŒããŒããæå¹ã«ããå¿
èŠããããŸãã
次ã«äžŠãã§ããã®ã¯ãååãäŸ¡æ Œãããã³ãããã販売ããåºèã®ãªã¹ããæã€è£œåã§ãã
public class Product
{
public virtual int Id { get ; private set ; }
public virtual string Name { get ; set ; }
public virtual double Price { get ; set ; }
public virtual IList<Store> StoresStockedIn { get ; private set ; }
public Product()
{
StoresStockedIn = new List <Store>();
}
}
* This source code was highlighted with Source Code Highlighter .
ãªã¹ãã«ã¯ãã©ã€ããŒãã»ãã¿ãŒããããäžèšã®ããã«ã³ã³ã¹ãã©ã¯ã¿ãŒã§åæåãè¡ãããŸãã
ååã®ããåºèã®ã¯ã©ã¹ãããã³ååãšåŸæ¥å¡ã®ãªã¹ãïŒ
public class Store
{
public virtual int Id { get ; private set ; }
public virtual string Name { get ; set ; }
public virtual IList<Product> Products { get ; private set ; }
public virtual IList<Employee> Staff { get ; private set ; }
public Store()
{
Products = new List <Product>();
Staff = new List <Employee>();
}
public virtual void AddProduct(Product product)
{
product.StoresStockedIn.Add( this );
Products.Add(product);
}
public virtual void AddEmployee(Employee employee)
{
employee.Store = this ;
Staff.Add(employee);
}
}
* This source code was highlighted with Source Code Highlighter .
ãã®ã¯ã©ã¹ã§ã¯ãNHibernateã§ã¯é¢é£ãšã³ãã£ãã£ãä¿åããåã«é¢ä¿ã®äž¡åŽãå®çŸ©ããå¿
èŠããããããå°ãããžãã¯ã説æããŸãã
ããã§ããšã³ãã£ãã£ã®èª¬æãçµãããŸãã 補åãšã¹ãã¢éã®å€å¯Ÿå€ã®é¢ä¿ãå®è£
ããããã®ãªã³ã¯ããŒãã«ã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
Mappimãšã³ãã£ãã£
ããã«ãåŸæ¥ã®NHibernateã䜿çšããå Žåã¯ãxmlãããã³ã°ãã¡ã€ã«ãšããŒã¿ããŒã¹æ§æã®äœæãéå§ããå¿
èŠããããŸãã ããããããã§Fluent NHibernateãæå¹ã«ãªããŸãã
以äžã§èª¬æãããã¹ãŠã®ãããã³ã°ã¯ã©ã¹ã¯ãMappingsãã©ã«ããŒã«ãããŸãã
Employee
ã¯ã©ã¹ã衚瀺ããããšããå§ããŸãããã
using FluentExample.Entities;
using FluentNHibernate.Mapping;
namespace FluentExample.Mappings
{
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
}
}
}
* This source code was highlighted with Source Code Highlighter .
衚瀺ã³ãŒãèªäœã¯ãFluentNHibernateã©ã€ãã©ãªã®
ClassMap
ããç¶æ¿ããã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«é
眮ãã
ClassMap
ã Fluent NHibernateããããã³ã°ãèŠã€ããããã«ã¯ã
public
修食åã§ã¯ã©ã¹ã宣èšããå¿
èŠããããŸãã ããã«å®å
šãªãããã³ã°ãæ€èšããŠãã ããã
public EmployeeMap()
{
Table( "Employee" );
Id(e => e.Id)
.GeneratedBy.Sequence( "Employee_seq" );
Map(e => e.FirstName);
Map(e => e.LastName);
References(e => e.Store);
}
* This source code was highlighted with Source Code Highlighter .
æåã®è¡ã®
Table()
ããããããããŒãã«ã®ååãæ
åœããŸãã 以äžã«ãååãæç€ºçã«æå®ããçç±ã説æããŸãã
Id()
ã¡ãœããã§ã¯ããªããžã§ã¯ããèå¥ãããã£ãŒã«ãã瀺ããŸãïŒNHibernateïŒ
<id>
ïŒã èªåã€ã³ã¯ãªã¡ã³ãã§ããŒã¿ããŒã¹ã䜿çšããå ŽåãFluent NHibernateã¯èªåçã«ã¿ã€ããèªèããIDãžã§ãã¬ãŒã¿ãŒïŒNHibernateïŒ
<generator>
ïŒãå²ãåœãŠãŸãã ãã ããOracleã«ã¯èªåã€ã³ã¯ãªã¡ã³ãããªããããã¡ãœãããã§ãŒã³ã®åŸåã§ç€ºãããã·ãŒã±ã³ã¹ã䜿çšããŸãã
次ã®2è¡ã¯ãã¿ã€ããšååãèªåçã«æ±ºå®ãããã¹ã«ã©ãŒããããã£ïŒNHibernateïŒ
<property>
ïŒã®è¡šç€ºã瀺ããŠããŸãã ããã¯ãããããã£ã®åœåèŠåã䜿çšããŠå®è£
ãããŸãã
Column()
ã¡ãœããã䜿çšããŠååãæåã§æå®ããããšãã§ããŸãããããã§ãããã©ã«ãã®èŠåã䜿çšããããç¬èªã®èŠåãèšå®ããããšããå§ãããŸãã
å¥çŽã®è©³çް ã
次ã®è¡ã¯ããªããžã§ã¯ããåæ°åœ¢ã®
Store
ã¯ã©ã¹ãåç
§ããŠããããšãã€ãŸããå€å¯Ÿå€ã®é¢ä¿ãå®è£
ããŠããããšã瀺ããŠããŸãã å€éšããŒåã¯ããã¯ãèŠåã«åŸã£ãŠãStore_idãšèŠãªãããŸãã å€éšããŒåã¯ã
Column()
ã¡ãœããã§ãªãŒããŒã©ã€ãã§ããŸãã
References()
ã¡ãœããã¯ããå€ãã®ãåŽããªã¬ãŒã·ã§ã³ã·ããã®å察åŽïŒã1ã€ãïŒã§äœ¿çšããã
HasMany()
ïŒNHibernateïŒ
<bag>
ïŒã¡ãœããã䜿çšãããããŒãã£ãŒã«ãã®ååã倿Žããããã®å¯Ÿå¿ããã¡ãœããã¯
KeyColumn()
ã§ãã
Table()
ã¡ãœããã«æ»ããŸãããã ããã§ã®ãã€ã³ãã¯ãããã©ã«ãã§ã¯ãããŒãã«åã衚瀺ãããšããFluent NHibernateã¯ããããåŒçšç¬ŠïŒå¥çŽãªã©ïŒã§å²ã¿ãŸããã€ãŸããããŒãã«ã«ã¯åŒçšç¬Šãšãšãã«ãEmployeeããšããååãä»ããããŸãã Oracleã§ã¯ãåŒçšç¬Šã§å²ãŸããååã®ã¿ã倧æåãšå°æåãåºå¥ããŸãã ãã®äŸã§ã¯ãåŒçšç¬Šã䜿çšãããããŒãã«åã®å€§æåãšå°æåãåºå¥ãããåŒçšç¬Šãä»ããªãããã«ãããããæç€ºçã«ç€ºããŸããã
ã¹ãã¢ã®ãããã³ã°ã«ç§»ããŸãããã
public class StoreMap : ClassMap<Store>
{
public StoreMap()
{
Table( "Store" );
Id(x => x.Id)
.GeneratedBy.Sequence( "Store_seq" );
Map(x => x.Name);
HasMany(x => x.Staff)
.Inverse()
.Cascade.All();
HasManyToMany(x => x.Products)
.Cascade.All()
.Table( "StoreProduct" );
}
}
* This source code was highlighted with Source Code Highlighter .
ããã§ãåè¿°ã®
Employee
ã¯ã©ã¹ã®å¯Ÿç§°çãª
HasMany()
åŒã³åºãã確èªããŸãã
HasManyToMany()
ã¡ãœããã䜿çšãããŸããããã¯ã
Table()
ã¡ãœããã«ãã£ãŠãã§ãŒã³ã§ååãæå®ãããäžéããŒãã«ãä»ããŠãã¹ãã¢ãšè£œåã®éã®å€å¯Ÿå€ã®é¢ä¿ãå®è£
ããŸãã
Inverse()
ã¡ãœããã¯ãã³ã¬ã¯ã·ã§ã³ã®ææè
ããªã¬ãŒã·ã§ã³ã·ããã®ããäžæ¹ã®ç«¯ãã€ãŸã
Employee
ã¯ã©ã¹ã§ãããæåã«ä¿åãããããšã瀺ããŠããŸãã
Cascade.All()
ã¯ãã€ãã³ããé¢é£ã¢ã€ãã ã«æž¡ããŸãã ã€ãŸããããšãã°ã¹ãã¢ãåé€ãããšããã®ã¹ãã¢ã®è£œåããã³ãã¹ãŠã®åŸæ¥å¡ãšã®éä¿¡ããã¹ãŠåé€ãããŸãã 詳现ã«ã€ããŠã¯ãNHibernateã®ããã¥ã¡ã³ããåç
§ããŠãã ããã
æåŸã«ã補åã衚瀺ããŸãã
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Table( "Product" );
Id(x => x.Id)
.GeneratedBy.Sequence( "Product_seq" );
Map(x => x.Name);
Map(x => x.Price);
HasManyToMany(x => x.StoresStockedIn)
.Cascade.All()
.Inverse()
.Table( "StoreProduct" );
}
}
* This source code was highlighted with Source Code Highlighter .
以åã®ãããã³ã°ã®çµéšãããããã§æ°ãããã®ãèŠã€ããããªãããšãé¡ã£ãŠããŸãã
æµfluentãªãããã³ã°ã®è©³çްãã芧ãã ãã ã
次ã«ãOracleãžã®æ¥ç¶ãèšå®ããŸãã
Oracleã«æ¥ç¶ãã
connectionStringã䜿çšããŠæ¥ç¶ããŸãã ãããžã§ã¯ãã«æ°ãããã¡ã€ã«App.configã远å ããæµhãªãŠãŒã¶ãŒã®æ¥ç¶æååãnhibernateãã¹ã¯ãŒãã§å
¥åããŸãïŒ
Copy Source | Copy HTML
- <ïŒ xml ããŒãžã§ã³ = "1.0" encoding = "utf-8" ïŒ >
- < èšå® >
- < connectionStrings >
- < ååã 远å =ãOracleã
- connectionString = "DATA SOURCE = orcl; PASSWORD = nhibernate; PERSIST SECURITY INFO = True;ãŠãŒã¶ãŒID = fluent"
- providerName = "Oracle.DataAccess.Client" />
- </ connectionStrings >
- </ èšå® >
次ã«ãéžæãããããã€ããŒã«ä»å±ãã
Oracle.DataAccess
ã¢ã»ã³ããªãžã®ãªã³ã¯ã远å ããå¿
èŠããããŸãã

ãªã³ã¯ã远å ããããã®ãã€ã¢ãã°ã¯ããããç°ãªãã§ããã-ç§ã¯
çç£æ§åäžããŒã«ã䜿çšããŠã
ãŸã ã
远å ããããªã³ã¯ããããã£
Copy Local = True
èšå®ã
Copy Local = True
ãããã¯ããããžã§ã¯ãã®ãã€ããªåºåãã¡ã€ã«ãå«ããã©ã«ããŒã«ãã®ã©ã€ãã©ãªãã³ããŒããå¿
èŠãããããšã瀺ããŸãã

䟿å®äžãå°ããªãã«ããŒã䜿çšããŠFluent NHibernateã§ã»ãã·ã§ã³ãéããŸãã
using FluentExample.Entities;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Driver;
namespace FluentExample
{
public static class FluentNHibernateHelper
{
private static ISessionFactory _sessionFactory;
public static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null )
{
var dbConfig = OracleDataClientConfiguration.Oracle10
.ConnectionString(c => c.FromConnectionStringWithKey( "Oracle" ))
.Driver<OracleDataClientDriver>()
.ShowSql();
_sessionFactory = Fluently.Configure()
.Database(dbConfig)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Employee>())
.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}
}
* This source code was highlighted with Source Code Highlighter .
ããŒã¿ããŒã¹æ§æã§ã¯ã
OracleDataClientConfiguration
åå空éã®å®çŸ©æžã¿ã¯ã©ã¹
OracleDataClientConfiguration
ã䜿çšããäœæããæ¥ç¶æååãšNHibernateãã©ã€ããŒã䜿çšããããã«æ§æããŸãã çæãããSQLã¯ãšãªã衚瀺ãããªãã·ã§ã³ãæå¹ã«ããããšãã§ããŸãã
ããŒã¿ããŒã¹æ§æã®è©³çް ã
次ã«ãNHibernateèªäœã®æ§æãå®è¡ããŸãã ããŒã¿ããŒã¹æ§æã眮ãæãããããã³ã°ã®ãœãŒã¹ã瀺ããã»ãã·ã§ã³ãã¡ã¯ããªãèŠæ±ããŸãã
Fluent Configurationã®è©³çްãã芧ãã ãã ã
ãã®æ®µéã§ãã»ãã·ã§ã³ã®ååŸã¯æåããã¯ãã§ãã
class Program
{
static void Main()
{
using (FluentNHibernateHelper.OpenSession())
{
}
}
}
* This source code was highlighted with Source Code Highlighter .
ããŒã¹ã®ãã¹ã
ããã§ããããžã§ã¯ãã¯æ¬¡ã®ãããªæ§é ã«ãªããŸãã

å®éã®ãã¹ããå®è¡ããŸãã
private static void Main()
{
using ( var session = FluentNHibernateHelper.OpenSession())
{
using ( var transaction = session.BeginTransaction())
{
var barginBasin = new Store { Name = "Bargin Basin" };
var superMart = new Store { Name = "SuperMart" };
var potatoes = new Product { Name = "Potatoes" , Price = 3.60 };
var fish = new Product { Name = "Fish" , Price = 4.49 };
var milk = new Product { Name = "Milk" , Price = 0.79 };
var bread = new Product { Name = "Bread" , Price = 1.29 };
var cheese = new Product { Name = "Cheese" , Price = 2.10 };
var waffles = new Product { Name = "Waffles" , Price = 2.41 };
var daisy = new Employee { FirstName = "Daisy" , LastName = "Harrison" };
var jack = new Employee { FirstName = "Jack" , LastName = "Torrance" };
var sue = new Employee { FirstName = "Sue" , LastName = "Walkters" };
var bill = new Employee { FirstName = "Bill" , LastName = "Taft" };
var joan = new Employee { FirstName = "Joan" , LastName = "Pope" };
// . ,
// many-to-many.
AddProductsToStore(barginBasin, potatoes, fish, milk, bread, cheese);
AddProductsToStore(superMart, bread, cheese, waffles);
//
AddEmployeesToStore(barginBasin, daisy, jack, sue);
AddEmployeesToStore(superMart, bill, joan);
//
session.SaveOrUpdate(barginBasin);
session.SaveOrUpdate(superMart);
transaction.Commit();
}
//
using (session.BeginTransaction())
{
var stores = session.CreateCriteria( typeof (Store)). List <Store>();
foreach ( var store in stores)
WriteStorePretty(store);
}
Console .ReadKey();
}
}
public static void AddProductsToStore(Store store, params Product[] products)
{
foreach ( var product in products)
store.AddProduct(product);
}
public static void AddEmployeesToStore(Store store, params Employee[] employees)
{
foreach ( var employee in employees)
store.AddEmployee(employee);
}
private static void WriteStorePretty(Store store)
{
Console .WriteLine(store.Name);
Console .WriteLine( " Products:" );
foreach ( var product in store.Products)
Console .WriteLine( " " + product.Name);
Console .WriteLine( " Staff:" );
foreach ( var employee in store.Staff)
Console .WriteLine( " " + employee.FirstName + " " + employee.LastName);
Console .WriteLine();
}
* This source code was highlighted with Source Code Highlighter .
以äžã§ãã
Oracleã§åè·¯ãçæãã
ã¹ã¯ãªãããæäŸããŸãã
次ã¯ïŒ
èè
ã¯ããã€ãã£ãã©ã€ãã©ãªã®æ©èœã®å€§éšåããµããŒãããŠããŸãããNHibernateã®äžéšã®æ©èœãããšãã°
<sql-insert>
ã¯ãŸã å©çšã§ããŸããã
Fluent NHibernateã䜿çšãããšãå
¥åãããèŠåã«åŸãããç¬èªã®èŠåãå®çŸ©ããã ãã§ãèªåçã«ãããã³ã°ãè¡ãããšãã§ããŸãã
ãã®ã©ã€ãã©ãªã䜿çšãããšãäœæãããããã³ã°ããã°ããåãã¹ã¿ã€ã«ã§ãã¹ãã§ããŸãã