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),但对于一个模式,像我有,我不明白这是如何做到的。
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");
}
}