NHibernate映射问题

时间:2011-08-04 02:53:08

标签: c# nhibernate-mapping

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被设置为movie表的外键,而dirID被设置为m_director的外键。

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

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

如果在movie和m_director之间没有中间表(例如m_directs),我可以看到使用list标签会相当容易,但对于像我这样的模式,我不明白这是如何完成的。

1 个答案:

答案 0 :(得分:2)

AFAIK public IList<string> Directors;不能很多,因为字符串没有对象标识,所以它不能从不同的电影链接。因此,你无法将它与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>

那么也可以为董事提供更多信息,如Birthdate等。

编辑:更正了拼写错误的拼写错误(因此未显示)并添加了流畅的映射

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");
    }
}