Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
FluentNHibernateÖ®»ù±¾Ó³ÉäÏê½â
 
×÷Õߣºzhang_xinxiu À´Ô´£ºCSDN ·¢²¼ÓÚ£º 2015-03-10
  3456  次浏览      35
 

×î½üÔÚ×öÏîÄ¿µÄʱºòÓõ½ÁË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·½Ê½À´Ó³Éä¶ÔÏó£¬ÊÇÒ»ÖÖ×Ô¶¯Ó³ÉäµÄ·½·¨£¬Ö»ÐèÒª¼Ì³ÐʵÏÖÊý¾Ý¿â±íµ½¶ÔÏóµÄת»»¹æÔò¾Í¿ÉÒÔÁË£¬¾ßÌåµÄʵÏÖ·½·¨½«»áÔÚÏÂÆªÎÄÕÂÖÐÏêϸÌÖÂÛ¡£

   
3456 ´Îä¯ÀÀ       35
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 12-11[±±¾©]
LLM´óÄ£ÐÍÓëÖÇÄÜÌ忪·¢ÊµÕ½ 12-18[±±¾©]
ǶÈëʽÈí¼þ²âÊÔ 12-25[±±¾©]
AIÔ­ÉúÓ¦ÓõÄ΢·þÎñ¼Ü¹¹ 1-9[±±¾©]
AI´óÄ£Ðͱàд¸ßÖÊÁ¿´úÂë 1-14[±±¾©]
ÐèÇó·ÖÎöÓë¹ÜÀí 1-22[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þ
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù


Èñ°²¿Æ¼¼ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨
³É¶¼ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£Æû³µ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
±±¾© Èí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£ Èí¼þ¼Ü¹¹Éè¼Æ°¸ÀýÓëʵ¼ù
±±¾© ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ÉîÛÚ ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù