|
×î½üÔÚ×öÏîÄ¿µÄʱºòÓõ½ÁËNHibernate£¬Ê¹ÓÃËü²¢²»À§ÄÑ£¬µ«ÊǺÜÂé·³¡£Èç¹ûÎÒµÄÊý¾Ý¿âÓм¸°ÙÕűíÈç¹ûÏëÒªÒ»¸ö¸öµÄÓ³ÉäÆñ²»ÊǺÜÂé·³£¬ËùÒÔÕâÖÖÇé¿öÏÂʹÓÃNHibernate¾Í»áºÜ±¿ÖØ£¬ËäÈ»Õâ¸öORM¿ò¼Ü±¾Éí¹¦ÄÜÇ¿´ó£¬µ«ÊôÓÚÖØÁ¿¼¶µÄÔÚʹÓõÄʱºòÌ«±¿ÖØÁË£¬ËùÒÔÐèÒªÔÚÏîÄ¿ÖиÄÁ¼¡£Õâʱºò¾ÍÓ¦Ô˶øÉúÁËFluentNHibernate£¬ËüÊÇÁ÷³©°æµÄNHibernate£¬Ö§³ÖËùÓеÄNHibernate¹¦ÄÜ£¬¶øÇÒ»¹·â×°ÁËÅäÖÃÎļþµÄÓ³É书ÄÜ£¬Ò²¾ÍÊÇ˵¿ÉÒÔ½«Ó³ÉäʹÓÃC#´úÂë±àд£¬ÕâÑùÔÚά»¤Ê±¾Í»áºÜ¼òµ¥¡£
ÔÚûÓÐFluentNHibernateµÄÇé¿öÏ£¬Èç¹ûʹÓÃNHibernateÀ´×öÊý¾Ý¿âÓ³É䣬ÄÇôÊ×ÏÈÐèÒª°²×°NHibernate£¨Ò²¾ÍÊÇÓ¦ÓÃNhibernate.dll£©£¬È»ºó´´½¨Nhibernate.cfg.xmlÊý¾Ý¿âÅäÖÃÎļþ£¬È»ºó´´½¨Ó³ÉäÎļþ.xml£¬×îºó´´½¨Session£¬Ö±½Ó¶Ô¶ÔÏó²Ù×÷¼´¿É¡£ËäÈ»ÕâÑù×ö²¢²»À§ÄÑ£¬µ«ÊǺÜÂé·³£¬ÏëÏóÏÂÈç¹ûÊý¾Ý¿â±íÓÐÉϰÙÕÅ£¬ÄÇʹÓÃÕâÖÖ·½·¨Ó³Éä²»¾ÍºÜÂé·³£¬±¿ÖØÁËÂð¡£
ÄÇôFluentNHibernateÓÐʲôºÃ´¦ÄØ£¬ËüÄܹ»Ê¡ÂÔ´´½¨Ó³ÉäÎļþ.xml£¬Ê¹ÓÃC#´úÂë±àдӳÉäÎļþ£¬ÕâÑù×öÄÜÔÚÒ»¶¨Çé¿öϼò»¯¹¤×÷Á¿£¬Í¬Ê±Ò²±ãÓÚ¶ÔÓ³Éä´úÂë½øÐÐÐ޸쬾ßÌåʹÓ÷½·¨½ÓÏÂÀ´»áÏêϸÌÖÂÛ¡£
Ò»¡¢´´½¨Êý¾Ý¿âÅäÖÃÎļþ
Ê×ÏÈ´´½¨Ò»¸öÊý¾Ý¿âµÄÅäÖÃÎļþ£¬¸Õ¿ªÊ¼Ê¹ÓõϰÊÖ¶¯±àд̫Âé·³£¬Õâʱºò¿ÉÒÔ¿¼ÂÇʹÓÃ×Ô´øµÄÅäÖÃÎļþ£¬ÔÚ¹ÙÍøÏÂÔØºó»áÓÐÒ»¸öÃûΪConfiguration_TemplatesµÄÎļþ¼Ð£¬ÀïÃæÓв»Í¬Êý¾Ý¿âµÄÅäÖÃÎļþ£¬¿ÉÒÔʹÓÃËüµÄĬÈÏÉèÖ㬵«ÊÇÐèÒª½«Ãû³Æ¸ÄΪNhibernate.cfg.xml¡£ÕâÀïʹÓÃÈçϵÄÅäÖãº
<?xml version="1.0" encoding="utf-8"?> <!-- This is the System.Data.dll provider for SQL Server --> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory name="KaddzvoteNHibernateFactory"> <property name="connection.driver_class"> NHibernate.Driver.SqlClientDriver </property> <property name="connection.connection_string"> Data Source=.;Initial Catalog=Mapping;Integrated Security=true;
Pooling=True;Min Pool Size=20;Max Pool Size=60 </property> <property name="dialect"> NHibernate.Dialect.MsSql2005Dialect </property> <property name="current_session_context_class">thread_static</property> <property name="generate_statistics">true</property> <property name="proxyfactory.factory_class">
NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate</property> <property name="query.substitutions"> true 1, false 0, yes 'Y', no 'N' </property> <!--ÅäÖÃÊÇ·ñÏÔʾsqlÓï¾ä£¬true´ú±íÏÔʾ--> <property name="show_sql">true</property> </session-factory> </hibernate-configuration> |
¶þ¡¢´´½¨ÊµÌå
NHibernateµÄ»ù±¾Ó³ÉäºÍHibernateÊÇÍêÈ«ÏàͬµÄ£¬Óйػù±¾µÄÓ³ÉäÕâÀï²»ÔÙÏêϸµÄÌÖÂÛ£¬¿ÉÒÔ·ÔıÊÕßµÄǰ¼¸ÆªÎÄÕ¡£ÏÂÃæ×Ô¼º×öÁËÒ»¸öСµÄÏîÄ¿Demo£¬ÑÝʾÈçºÎʹÓÃNHibernate´´½¨Ò»¸öÊý¾Ý¿âµÄÓ³É䣬¾ßÌåµÄÊý¾Ý¿â½á¹¹Í¼ÈçÏ£º

ÉÏͼµÄÊý¾Ý¿â½á¹¹Í¼Öк¸ÇÁË»ù±¾µÄÓ³Éä¹ØÏµ£¬ÔÚʵ¼ÊµÄÏîÄ¿ÖÐÒ²¾ÍÊÇÉÏÃæ³öÏֵļ¸ÖÖ»ù±¾µÄ¹ØÏµ£¬ÆäÖк¸ÇÁËÒ»¶ÔÒ»¡¢¶à¶ÔÒ»¡¢¶à¶Ô¶àµÄ¹ØÁª¹ØÏµ£¬½ÓÏÂÀ´½«»áʹÓÃFluentNHibernateÀ´ÊµÏÖ»ù±¾µÄÓ³Éä¹ØÏµ¡£
2.1 ´´½¨ÊµÌå
Ìí¼ÓÍêÅäÖÃÎļþºóʹÓõÚÈý·½¹¤¾ß½«Êý¾Ý¿â±íµ¼³öΪʵÌå¶ÔÏó£¬Ò²¾ÍÊÇÌí¼ÓÊý¾Ý¿â±íµÄʵÌå¶ÔÏó¡£Ìí¼ÓÍê³Éºó¼ÌÐøÌí¼ÓÊý¾Ý¿âµÄÓ³ÉäÀ࣬Ìí¼ÓÓ³ÉäÀàʱÐèÒª¼Ì³ÐNHibernateµÄClassMap<T>À࣬½«Êý¾Ý¿âʵÌå·ÅÖõ½¶ÔÏóÄÚ²¿£¬ÕâÑùÔÚÓ³ÉäʱÄܹ»Ö±½ÓʹÓã¬ËüʹÓõÄÊÇ·ºÐÍÀ´ÊµÏֵġ£Êý¾Ý¿â±íµÄʵÌåÈçÏ´úÂ룺
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using FluentNHibernate.Automapping; using FluentNHibernate.Conventions; using NHibernate; using NHibernate.Collection.Generic; namespace ClassLibrary1.mapping { public abstract class Entity { virtual public int ID { get; set; } } public class User : Entity { virtual public string Name { get; set; } public virtual string No { get; set; } public virtual UserDetails UserDetails { get; set; } } public class Project : Entity { public Project() { Task=new List<Task>(); Product=new List<Product>(); } public virtual string Name { get; set; } public virtual User User { get; set; } public virtual IList<Product> Product { get; set; } public virtual IList<Task> Task{get;protected set; } } public class Product : Entity { public Product() { Project=new List<Project>(); } public virtual IList<Project> Project { get; set; } public virtual string Name { get; set; } public virtual string Color { get; set; } } public class Task : Entity { public virtual string Name { get; set; } public virtual Project Project { get; set; } } public class UserDetails : Entity { public virtual User User { get; set; } public virtual int Sex { get; set; } public virtual int Age { get; set; } public virtual DateTime BirthDate { get; set; } public virtual decimal Height { get; set; } } } |
Èý¡¢Ó³ÉäÏê½â
ÔÚÌí¼ÓÓ³ÉäÎļþʱÐèÒª¼Ì³ÐFluentNHibernateµÄClassMap<T>À࣬ȻºóÔÚÀàµÄ¹¹Ô캯ÊýÖÐÌí¼ÓÓ³ÉäµÄ·½·¨£¬¾ßÌåµÄ·½·¨ÊÇʹÓõÄlamuda±í´ïʽÀ´Ó³ÉäµÄ£¬·½·¨µÄÃû³Æ¸úÅäÖÃÎļþµÄÃû³Æ»ù±¾Ò»Ö£¬ÊéдҲºÜ·½±ã£¬½ÓÏÂÀ´½«»á²ð·ÖÓ³ÉäÀ´Ïêϸ½²½âFluentNHibernateµÄMappingʹÓ÷½·¨¡£
3.1 Ò»¶ÔÒ»Ó³Éä
Ê×ÏÈÀ´¿´¿´Ò»¶ÔÒ»µÄÓ³Éä¹ØÏµ£¬Óû§ºÍÓû§ÐÅÏ¢±íÔÚʵ¼ÊÖÐÊÇÒ»¶ÔÒ»µÄ¹ØÏµ£¬ÕâÁ½¸ö±íÖ®¼äÊÇͨ¹ýʹÓÃUserIDÀ´Ï໥¹ØÁªµÄ£¬ËüÃÇÓÐÒ»¸ö¹²Í¬µÄID£¬ÔÚ²åÈëUsers±íµÄͬʱҲҪдÈëUserDetails±í£¬ËùÒÔÐèÒªÌí¼ÓÒ»¶ÔÒ»µÄÏÞÖÆ¹ØÏµ£¬¾ßÌåµÄÔÚUsersºÍUsersDetailsÁ½±íµÄÓ³Éä·½·¨ÈçÏ´úÂ룺
public class UsersMapping : ClassMap<User> { public UsersMapping() { Table("Users"); LazyLoad(); Id(x => x.ID).Column("UserID").GeneratedBy.Identity(); HasOne(x => x.UserDetails).Cascade.All().PropertyRef("User"); Map(x => x.Name).Nullable(); Map(x => x.No).Nullable(); } } |
Note:FluentNHibernateÔÚÓ³ÉäʱÓкܶàÖÖÓ³Éä·½·¨£¬±ÈÈçCascadeËüÊÇÖ¸¸Ã¶ÔÏóÔÚ½øÐвÙ×÷ʱ¹ØÁªµ½µÄ×Ó¶ÔÏóµÄ²Ù×÷ÀàÐÍ£¬ÉÏÃæÖ¸¶¨ÁËAll˵Ã÷ËùÓеIJÙ×÷¶¼»á¹ØÁªµ½×Ó±í£¬»¹ÓÐSaveUpdateÔÚÌí¼ÓºÍ¸üÐÂʱ¹ØÁª×Ó±í£¬ÁíÍ⻹ÓÐNoneÀàÐͲ»ÍƼöʹÓôËÀàÐÍÒòΪ»á³öÏֺܶàÎÊÌâ¡£
UserDetailsµÄÓ³ÉäÖеÄÖ÷¼üIDÊǼ̳Ð×ÔUserÀàµÄËùÒÔÔÚÖ¸¶¨IDʱÐèÒªÌí¼ÓForeignÍâ¼ü¹ØÁªµÄÊôÐÔÃû£¬ÄÚ²¿µÄ²ÎÊýÒ»¶¨ÒªÊÇUserDetailsµÄÊôÐÔÃû¡£
public class UserDetailsMapping : ClassMap<UserDetails> { public UserDetailsMapping() { Table("UserDetails"); LazyLoad(); Id(x => x.ID).Column("UserID").GeneratedBy.Foreign("User"); Map(x => x.Height).Nullable(); Map(x => x.Age).Nullable(); Map(x => x.Sex).Nullable(); Map(x => x.BirthDate).Nullable(); HasOne(x => x.User).Cascade.All(); } } |
ʹÓòâÊÔ·½·¨²é¿´Ó³Éä½á¹û£¬¾ßÌåµÄ²âÊÔ·½·¨ÈçÏ£º
using System; using System.Collections.Generic; using ClassLibrary1.mapping; using FluentNHibernate.Testing; using ClassLibrary1; using NHibernate; using NUnit.Framework; namespace UnitTestProject1 { [TestFixture] public class UnitTest1:NHConfig { [Test] public void TestUsers_UserDetails() { //get user from database User user1 = Session.Load<User>(1); //save the User data Session.Transaction.Begin(); User user=new User() { Name = "Jack", No = "12321" }; UserDetails userDetails=new UserDetails() { Age = 12, BirthDate = DateTime.Now.Date, Height = 240, Sex = 1 }; user.UserDetails = userDetails; userDetails.User = user; Session.Save(user); Session.Transaction.Commit(); } } } |
ÔÚgetºÍsave¶ÔÏóµÄµØ·½Ìí¼Ó¶Ïµã£¬DebugÔËÐвâÊԾͻῴµ½Ö´ÐеĽá¹û¡£
3.2 Ò»¶Ô¶à/¶à¶ÔÒ»
Ò»¶Ô¶àºÍ¶à¶ÔÒ»ÊÇÏà¶Ô¶øÑÔµÄÕýÈçÉÏÀýÖеÄProjectsºÍTasksÀàËÆ£¬Ò»¸öProjectsÓжà¸öTasks£¬·´¹ýÀ´Ëµ¾ÍÊǶà¸öTasks¿ÉÄÜ»á¶ÔÓ¦Ò»¸öProjectsËùÒÔÓÐʱһ¶Ô¶àµÄ¹ØÏµÒ²¾ÍÊǶà¶ÔÒ»µÄ¹ØÏµ£¬Ö»²»¹ýÊÇÒ»ÖÖÌØÊâµÄ¶à¶ÔÒ»¡£ÕâÀïµÄ¶à¶ÔÒ»±È½ÏÌØÊ⣬³£¼ûµÄ¶à¶ÔÒ»µÄ¹ØÏµ±ÈÈçѧÉúºÍ°à¼¶µÄ¹ØÏµ£¬¶à¸öѧÉúÊôÓÚÒ»¸ö°à¼¶¡£
Ò»¶Ô¶àµÄÓ³Éä·½·¨ºÍÒ»¶ÔÒ»µÄÓ³Éä·½·¨ÆäʵºÜ¶àµØ·½ÊÇÀàËÆµÄ£¬Ö»²»¹ýÒ»¶Ô¶àµÄ¹ØÏµÀïÃæÒªÌí¼ÓÒ»¸öÍâ¼üÒýÓùØÏµ£¬È»ºóÔÚ¶àµÄÒ»¶ËÌí¼ÓÒ»¸öÍâ¼ü£¬ÔÚÒ»µÄÒ»¶ËÌí¼ÓHasMany£¬Ó³Éäµ½ProjectsºÍTasksÖоÍÊÇÔÚTasks£¨¶à£©ÖÐÌí¼ÓProjectµÄÍâ¼ü¡£
3.2.1 Ó³Éä
Ê×ÏÈʱTasks±íµÄÓ³É䣬ÒòΪTasks±íÊǶàµÄÒ»¶Ë£¬ËùÒÔÒªÌí¼Ó¶ÔProjects±íµÄÍâ¼üÒýÓùØÏµ£¬ÁíÍâÒòΪÊÇÒ»ÖÖÍâ¼üÒýÓò»¹ØÏµµ½¸¸±íµÄ²Ù×÷£¬ËùÒÔÕâÀï¿ÉÒÔʹÓÃCascade.None()¡£
public class TasksMappping : ClassMap<ClassLibrary1.mapping.Task> { public TasksMappping() { Table("Tasks"); LazyLoad(); Id(x => x.ID).Column("TaskID").GeneratedBy.Identity(); References(x => x.Project).Nullable().Column("ProjectID").Cascade.None(); Map(x => x.Name).Nullable(); } } |
ÔÚProjects±íÖУ¬ÒòΪ¸Ã±íÖеÄÒ»¸öID»á¶ÔÓ¦¶à¸öTasksËùÒÔÔÚÌí¼ÓHasMany·½·¨£¬À´±íÃ÷ProjectsºÍTasksµÄ¶à¶ÔÒ»µÄ¹ØÏµ£¬ÈçÏ´úÂëËü»áÉæ¼°µ½ÈÎÎñµÄÌí¼ÓºÍ¸üвÙ×÷£¬ËùÒÔÐèҪʹÓÃCascade.SaveUpdate()¡£
public class ProjectsMapping:ClassMap<Project> { public ProjectsMapping() { Table("Projects"); LazyLoad(); Id(x => x.ID).Column("ProjectID").GeneratedBy.Identity(); References(x => x.User).Column("UserID").Cascade.None(); Map(x => x.Name).Nullable(); HasMany(x => x.Task).KeyColumn("ProjectID").LazyLoad().Cascade.SaveUpdate(); } } |
Note:TasksMappingÖеÄÍâ¼ü¹ØÏµÊ¹ÓõÄÊÇCascade.NoneÕâ˵Ã÷ËüµÄ²Ù×÷²»»áÉæ¼°µ½ProjectsµÄ²Ù×÷£¬µ«ÊÇProjectsMappingÖÐʹÓÃÁËCascade.SaveUpdate()·½·¨ËùÒÔÔÚsave»òÕßupdate
ProjectsµÄʱºò»áÁ¬´ø×ÅÐÞ¸ÄTasks¡£
3.2.2 Unit Test
±àдµ¥Ôª²âÊÔ´úÂëÈçÏ£º
public void TestOneToMany() { Project project = Session.Get<Project>(15); //save the User data Session.Transaction.Begin(); Task task = new Task() { Name ="create", Project = project }; Session.Save(task); Session.Transaction.Commit(); Task task1 = Session.Get<Task>(1); } |
Ö´Ðв鿴½á¹û£º

ÕâÀïʹÓõÄÒ»¶Ô¶àµÄ¹ØÁªÖ»Êǵ¥ÏòµÄ¹ØÁª£¬ÔÚ¹ØÁªÖв»½öÓе¥ÏòµÄÁíÍ⻹ÓÐË«Ïò¹ØÁª£¬¾ßÌåʹÓ÷½·¨ÕâÀï²»ÔÙÏêϸÌÖÂÛ£¬ÓÐÐËȤѧϰµÄ»°¿ÉÒÔ·ÔıÊÕßµÄǰƪÎÄÕÂÓйØHibernateµÄ¹ØÁª¹ØÏµ¡£
3.3 ¶à¶Ô¶à
ÉÏÎÄÏêϸÌÖÂÛÁËÒ»¶ÔÒ»¡¢¶à¶ÔÒ»/Ò»¶Ô¶àµÄ¹ØÏµ£¬Ê¹ÓÃFluentNHibernateÀ´Ó³ÉäÕâÖÖ¹ØÏµ¾ÍºÜ¼òµ¥ÁË£¬×îºó¼ÌÐøÌÖÂÛ¶à¶Ô¶àµÄ¹ØÏµ£¬¶à¶Ô¶àµÄ¹ØÏµÔÚʹÓõÄʱºò¸üÀàËÆÓÚÒ»¶ÔÒ»µÄ¹ØÏµ£¬ÒòΪËüÊôÓÚË«ÏòµÄ¹ØÁª£¬ËùÒÔÐèÒªÔÚ¹ØÁªµÄÁ½¶ËͬʱÌí¼ÓHasManyToManyµÄÓ³Éä·½·¨£¬ÁíÍâ·´Ó¦µ½Êý¾Ý¿âÖÐÕâÆäʵÊÇÐèÒª½¨Á¢¹ØÁª±í£¬ÀûÓõÚÈýÕűíÀ´Î¬»¤Ë«ÏòµÄ¹ØÏµ£¬¾ßÌåµÄʹÓ÷½·¨ÈçÏÂʵÀý¡£
3.3.1 Ó³Éä
ÔÚÏîÄ¿Öг£¼ûµÄ¶à¶Ô¶àµÄ¹ØÏµÓкܶ࣬±ÈÈç±¾ÀýÖÐʹÓõÄProductºÍProjectµÄ¹ØÏµ£¬Ò»¸öProject»áÓÐÓкܶàProduct£¬Í¬Ê±Ò»¸öProductÒ²¿ÉÄÜ»áÔÚ¶à¸öProjectÖУ¬ËüÃÇÖ®¼ä¾ÍÐγÉÁ˶à¶Ô¶àµÄ¹ØÁª¹ØÏµ¡£·´Ó³µ½Ó³Éä¹ØÏµÖУ¬´úÂëÈçÏ£º
public class ProjectsMapping:ClassMap<Project> { public ProjectsMapping() { Table("Projects"); LazyLoad(); Id(x => x.ID).Column("ProjectID").GeneratedBy.Identity(); References(x => x.User).Column("UserID").Cascade.None(); Map(x => x.Name).Nullable(); HasMany(x => x.Task).KeyColumn("ProjectID").LazyLoad().Cascade.SaveUpdate(); HasManyToMany(x => x.Product).ParentKeyColumn("ProjectID")
.ChildKeyColumn("ProductID").Table("ProjectProduct"); } } public class ProductMapping : ClassMap<Product> { public ProductMapping() { Table("Product"); Id(x => x.ID).Column("ProductID").GeneratedBy.Identity(); Map(x => x.Name).Nullable(); Map(x => x.Color).Nullable(); HasManyToMany(x => x.Project).ParentKeyColumn("ProductID")
.ChildKeyColumn("ProjectID").Table("ProjectProduct"); } } |
¾ßÌåÌí¼Ó¹ØÁªµÄ²½ÖèÈçÏ£º
£¨1£©ÔÚÓ³ÉäµÄÁ½¶ËͬʱÌí¼ÓHasManyToManyµÄ¹ØÏµÕâÑù¾ÍÐγÉÁËË«ÏòµÄ¹ØÁª¹ØÏµ
£¨2£©Ö¸¶¨Ó³ÉäµÄParentKeyºÍChildKey£¬Ò»°ã»á½«¶ÔÏó±¾ÉíµÄIDÖ¸¶¨ÎªParentKey£¬¹ØÁª¶ÔÏóµÄIDÖ¸¶¨ÎªChildKey
£¨3£©Ö¸¶¨¹ØÁª¹ØÏµµÄ¹ØÏµ±í£¬Ê¹ÓÃTable·½·¨Ö¸¶¨¹ØÁª±í£¬ÈçÉÏʾÀýµÄTable("ProjectProduct")¡£
3.3.2 Unit Test
×îºóÌí¼ÓÒ»¸ö²âÊÔ·½·¨À´²é¿´Ó³ÉäµÄ½á¹û£¬ÊÇ·ñʵÏÖÁ˶à¶Ô¶àµÄÓ³Éä¹ØÏµ£¬¾ßÌå²âÊÔ·½·¨ÈçÏ¡£
public void TestManyToMany() { Session.Transaction.Begin(); //get the Project ICriteria query = Session.CreateCriteria<Project>(); IList<Project> projects = query.List<Project>(); //create the Product Product product=new Product() { Name = "Product1", Color = "Red" }; product.Project = projects; Session.Save(product); Session.Transaction.Commit(); } |
DebugÔËÐвâÊÔ·½·¨£¬ÔËÐе½get projects´¦²é¿´projectsËù»ñÈ¡µÄ¶ÔÏóÐÅÏ¢ÈçÏÂͼ£º

´ÓÉÏͼ¿ÉÒÔ¿´³öÒѾ»ñÈ¡µ½ÁËÓëprojectsÏà¹ØÁªµÄProduct£¬Õâ¾ÍÊǶà¶Ô¶àµÄ¹ØÏµ£¬ÔÚ»ñÈ¡projectsʱͬʱ»ñÈ¡ÁËÓëËü¹ØÁªµÄProducts£¬Èç¹ûÕâÀïʹÓÃLazyload·½Ê½µÄ»°¾Í²»»á»ñÈ¡ËùÓеÄÐÅÏ¢£¬ËùÒÔÒª¸ù¾Ý¾ßÌåµÄÇé¿ö¶ø¶¨¡£
¼ÌÐøÔËÐвâÊÔ£¬³É¹¦Ö´ÐС£

²é¿´Êý¾Ý¿â·¢ÏÖÊý¾ÝÒѾ³É¹¦Ìí¼Ó£¬ÈçÏÂͼ£º

½áÓï
±¾ÎÄÖ÷ÒªÌÖÂÛÁËFluentNHibernateµÄ»ù±¾Ê¹Óü¼ÇÉ£¬Í»³öÌÖÂÛÁËÒ»¶ÔÒ»µÄË«Ïò¹ØÁªÓ³É䣬һ¶Ô¶àµÄµ¥Ïò¹ØÁªºÍ¶à¶Ô¶àµÄË«Ïò¹ØÁª¹ØÏµ£¬ËüÃÇʹÓÃÏ൱¼òµ¥£¬ÒòΪÓÐÁËFluentNHibernate£¬Ö»ÐèÒªÁË½â¹ØÁªµÄ¹æÔò¾Í¿ÉÒÔÁË£¬´ÓÊý¾ÝÄ£Ð͵½¶ÔÏóÄ£ÐÍÕæµÄ¾ÍºÜ¼òµ¥ÁË¡£
ËäȻʹÓÃFluentNHibernateÔÚÒ»¶¨³Ì¶ÈÉϼõÉÙÁ˱àд´úÂ룬µ«ÊDz¢²»ÄÜÕæÕýµÄ½â¾ö´úÂëÈßÓàµÄ·±ËöÎÊÌ⣬¿É·ñÓÐÒ»Öв»ÐèÒª±àдMapping´úÂëµÄ·½·¨À´ÊµÏÖÓ³Éä¹ØÏµÄØ£¿ÊǵÄFluentNHibernate»¹·â×°ÁËÒ»ÖÖAutoMapping·½Ê½À´Ó³Éä¶ÔÏó£¬ÊÇÒ»ÖÖ×Ô¶¯Ó³ÉäµÄ·½·¨£¬Ö»ÐèÒª¼Ì³ÐʵÏÖÊý¾Ý¿â±íµ½¶ÔÏóµÄת»»¹æÔò¾Í¿ÉÒÔÁË£¬¾ßÌåµÄʵÏÖ·½·¨½«»áÔÚÏÂÆªÎÄÕÂÖÐÏêϸÌÖÂÛ¡£
|