NHibernate映射问题

本文关键字:问题 映射 NHibernate | 更新日期: 2023-09-27 18:04:22

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的外键。

我不明白如何通过映射xml将它映射到像这样的对象。

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

我可以看到这将是相当容易与列表标签,如果没有电影和m_director之间的中间表(如m_directs),但对于一个模式,像我有,我不明白这是如何做到的。

NHibernate映射问题

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>

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

编辑:更正了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");
    }
}