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标签会相当容易,但对于像我这样的模式,我不明白这是如何完成的。
答案 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");
}
}