2011-08-04 255 views
0
CREATE TABLE IF NOT EXISTS `movie` (
    `m_ID` varchar(9) NOT NULL 
    `ReleaseDate` date 
    `Title` varchar(255) NOT NULL 
    PRIMARY KEY (`m_ID`), 
    KEY `m_ID` (`ReleaseDate`,`Title`,) 
) 
CREATE TABLE IF NOT EXISTS `m_director` (
    `dirID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `dirName` varchar(40) NOT NULL, 
    PRIMARY KEY (`dirID`), 
    UNIQUE KEY `dirName` (`dirName`) 
) 
CREATE TABLE IF NOT EXISTS `m_directs` (
    `m_ID` char(9) NOT NULL 
    `dirID` int(11) unsigned NOT NULL, 
    UNIQUE KEY `m_ID_2` (`m_ID`,`dirID`), 
    KEY `m_ID` (`m_ID`), 
    KEY `dirID` (`dirID`) 
) 

另请注意,m_ID设置为电影表的外键,而dirID设置为m_director的外键。NHibernate映射问题

我不明白这将通过映射xmls映射到像这样的对象。

public class Movie 
{ 
public string MovieTitle{get;set;} 
public IList<string> Directors; 
public DateTime ReleaseDate; 
} 

我可以看到,如果没有电影,m_director(如m_directs)之间的中介表这将是相当容易的一个列表的标签,但对于一个模式像我有,我不明白这是怎么回事完成。

回答

2

AFAIK public IList<string> Directors;不能成为一个manytomany因为字符串没有对象的身份,所以它不能从不同的电影链接。因此,你不能用NHibernate映射它很多东西。最好的办法是

public class Movie 
{ 
    public virtual string Title { get; set; } 
    public virtual ICollection<Director> Directors { get; set; } 
    public virtual DateTime ReleaseDate { get; set; } 

    public virtual IEnumerable<string> Directornames 
    { get { return Directors.Select(dir => dir.Name); } } 
} 

public class Director 
{ 
    public virtual int Id {get; protected set;} 
    public virtual string Name {get; set;} 
} 

    <class name="Movie" table="movie"> 
    <id name="Id" column="m_ID"/> 
    <property name="ReleaseDate"/> 
    <property name="Title"/> 
    <bag name="Directors" table="m_directs"> 
     <key column="m_ID" not-null="true"/> 
     <many-to-many class="Director" column="dirID"/> 
    </bag> 
    </class> 

    <class name="Director" table="m_director"> 
    <id name="Id" column="dirID"/> 
    <property name="Name" column="dirName"/> 
    </class> 

那么它也可以给导演更多的信息,如出生日期等。

编辑:纠正错别字和XML映射的压痕(因此未显示),并加入流利的映射

class MovieMap : ClassMap<Movie> 
{ 
    public MovieMap() 
    { 
     Table("movie"); 

     Id(m => m.Id, "m_Id").GeneratedBy.Identity(); 

     Map(m => m.Title); 
     Map(m => m.ReleaseDate); 

     HasManyToMany(m => m.Directors) 
      .Table("m_directs") 
      .ParentKeyColumn("m_ID") 
      .ChildKeyColumn("dirID") 
      .AsBag() 
      .Cascade.All(); 
    } 
} 

class DirectorMap : ClassMap<Director> 
{ 
    public DirectorMap() 
    { 
     Table("m_director"); 

     Id(d => d.Id, "dirID").GeneratedBy.Identity(); 

     Map(d => d.Name, "dirName"); 
    } 
} 
+0

嗯好吧,那我怎么该列表映射到我的架构?抱歉,仍然不完全了解nhibernate的工作原理= \ – user623879

+0

我在使用Fluent Nhibernate,它可以帮助我理解,但看起来像Director类需要IList 才能工作。无论如何要避免这种情况? – user623879

+1

@ user623879:如果您还没有计划尚未迭代到导演指导的电影,则不需要,您可以删除Director类下的IList 。你可以试试这个例子:http://www.ienablemuch.com/2011/07/using-checkbox-list-on-aspnet-mvc-with.html尝试删除Genre类的IList ,代码仍然可以工作。尽管在类关系的两端都设置IList是微不足道的,但可以将它们全部放在一起:-) –