2011-08-04 303 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是微不足道的,但可以將它們全部放在一起:-) –