Nhibernate3.0cookbook学习笔记一对多与多对多映射-创新互联

1 一对多映射

10年建站经验, 成都网站制作、做网站客户的见证与正确选择。创新互联提供完善的营销型网页建站明细报价表。后期开发更加便捷高效,我们致力于追求更美、更快、更规范。

还是用Movie与ActorRole来说明。我们假设一个Movie可以有多个ActorRole,而一个ActorRole只能对应一个Movie。

设置一对多映射主要是父类(Movie)要做相应的更改。我们在Movie类中要增加一个集合,用来表示该Movie下的所有ActorRole。

 public class Movie : Product 
    {
public virtual string Director { get; set; }
//ActorRole集合,用于列举该Movie下的所有ActorRole   public virtual IList Actors { get; set; }
    }

相应的我们的Movie.hbm.xml也要做相应的更改,增加一个list节点

                   

ActorRole很简单,只有两个字段:

 public class ActorRole : Entity 
    {
public virtual string Actor { get; set; }
public virtual string Role { get; set; }
    }

对应的ActorRole.hbm.xml:

           

我们用一个方法向数据库中插入两条数据:

View Code
 private void CreateMovies(ISession session)
        {
            session.Save(
new Movie()
                {
                    Name= "Raiders of the Lost Ark",
                    Description= "Awesome",
                    UnitPrice= 9.59M,
                    Director= "Steven Spielberg",
                    Actors= new List()
                    {
new ActorRole()
                        {
                            Actor= "Harrison Ford",
                            Role= "Indiana Jones"
                        }
                    }
                }
        );
            session.Save(
new Movie()
                    {
                        Name= "The Bucket List",
                        Description= "Good",
                        UnitPrice= 15M,
                        Director= "Rob Reiner",
                        Actors= new List()
                        {
new ActorRole()
                            {
                                Actor= "Jack Nicholson",
                                Role= "Edward Cole"
                            },
new ActorRole()
                            {
                                Actor= "Morgan Freeman",
                                Role= "Carter Chambers"
                            }
                        }
                    }
                );
        }

看下数据库中两张表的存储状况

在Product表中我们新增了两个Movie:

再看看ActorRole表:

可以看到ActorRole表中有三条记录,而后面两要是对应同个MoiveId的。

2 多对多映射

 多对多其实就是两个一对多,中间要生成第三张表来转换。我们用Movie与Actor来说明 。

 我们新增一个Actor类:

public class Actor : Entity
    {
//姓名   public virtual string ActorName { get; set; }
//性别   public virtual bool ActorSex { get; set; }
//对应的Movie集合   public virtual IList Movies { get; set; }
    }

设置对应的Actor.hbm.xml:

                         

相应的修改Movie.cs,增加一个Actor集合:

public class Movie : Product 
    {
public virtual string Director { get; set; }
//ActorRole集合,用于列举该Movie下的所有ActorRole   public virtual IList ActorRoles { get; set; }
//Actor集合   public virtual IList Actors { get; set; }
    }

修改Movie.hbm.xml,增加以下内容:

     

我们新增一个测试数据,通过新增Actor来新增Movie:

View Code
private void CreateActor(ISession session)
        {
var movie1 = new Movie()
            {
                Name= "黄金大劫案",
                Description= "喜剧",
                UnitPrice= 10.59M,
                Director= "宁浩",
                ActorRoles= new List()
                    {
new ActorRole()
                        {
                            Actor= "陶虹",
                            Role= "芳蝶"
                        },
new ActorRole()
                        {
                            Actor= "雷佳音",
                            Role= "小东北"
                        }
                    },
                
            };
        
var actor1 = new Actor()
            {
                ActorName= "陶虹",
                ActorSex= false,
                Movies= new List() { movie1
                }
            };
var actor2 = new Actor()
            {
                ActorName= "雷佳音",
                ActorSex= true,
                Movies= new List() { movie1
                }
            };
            session.Save(movie1);
            session.Save(actor1);
            session.Save(actor2);
        }

执行后查看数据库
Actor表中数据,新增了两个记录:

再看看Product中的Movie记录,新增了一条:

最后是中间表MovieActor:

我们看到有两个ActorId对应同一个MoiveId.

当然我们也可以通过新增Movie来新增Actor,实现方法差不说,就不多说了。

源码下载:点我。


网页题目:Nhibernate3.0cookbook学习笔记一对多与多对多映射-创新互联
网页URL:http://pwwzsj.com/article/icpcd.html