因此,讓代碼本身入手:NHibernate的子集
public class Site
{
private Int32 id;
private string name;
private IList<SiteDomain> sitedomains;
public Site()
{
}
public virtual Int32 Id
{
get { return id; }
set { id = value; }
}
public virtual IList<SiteDomain> Domains
{
get { return sitedomains; }
set { sitedomains = value; }
}
public virtual string Name
{
get { return name; }
set { name = value; }
}
}
public class SiteDomain
{
private Int32 id;
private string domain;
public SiteDomain()
{
}
public virtual Int32 Id
{
get { return id; }
set { id = value; }
}
public virtual string Domain
{
get { return domain; }
set { domain = value; }
}
}
因此,大家可以看到我不需要從SiteDomain到網站的任何鏈接。但我想要在網站實體中擁有網站域名列表。
下面是DDL:
CREATE TABLE `site` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(500) NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB;
CREATE TABLE `sitedomains` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`siteid` BIGINT(20) UNSIGNED NOT NULL,
`domain` VARCHAR(500) NOT NULL,
PRIMARY KEY (`id`),
INDEX `sitedomains_siteid` (`siteid`),
CONSTRAINT `FK_sitedomains_siteid` FOREIGN KEY (`siteid`) REFERENCES `site` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)
ENGINE=InnoDB;
映射我此刻的了:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="PhoneTracking.Core" assembly="PhoneTracking.Core">
<class name="Site" table="site">
<id name="Id" type="Int32">
<column name="ID" not-null="true" />
</id>
<property name="Name" type="AnsiString" />
<list name="Domains" cascade="all">
<key column="SiteId" />
<index />
<one-to-many class="SiteDomain" />
</list>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="PhoneTracking.Core" assembly="PhoneTracking.Core">
<class name="SiteDomain" table="sitedomains">
<id name="Id" type="Int32">
<column name="ID" not-null="true" />
</id>
<property name="Domain" type="AnsiString" />
</class>
</hibernate-mapping>
它檢索非常好,當我得到一個網站。它帶有所有關聯網站的域名。但隨後我將新網站保存回數據庫,它只保存網站本身,而不插入網站的域名。
我應該怎樣做纔對?
我知道NHibernate的ISet。我只是想讓它成爲IList,因爲它對我來說更舒服。
編輯:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="PhoneTracking.Core" assembly="PhoneTracking.Core">
<class name="SiteDomain" table="sitedomains">
<id name="Id" type="Int32">
<column name="ID" not-null="true" />
</id>
<property name="Domain" type="AnsiString" />
<many-to-one name="Site" column="siteid" />
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="PhoneTracking.Core" assembly="PhoneTracking.Core">
<class name="Site" table="site">
<id name="Id" type="Int32">
<column name="ID" not-null="true" />
</id>
<property name="Name" type="AnsiString" />
<bag name="Domains" inverse="true" cascade="all">
<key column="SiteId" />
<one-to-many class="SiteDomain" />
</bag>
</class>
</hibernate-mapping>
更新SiteDomain類:
public class SiteDomain
{
private Int32 id;
private string domain;
private Site site;
public SiteDomain()
{
}
public virtual Int32 Id
{
get { return id; }
set { id = value; }
}
public virtual Site Site
{
get { return site; }
set { site = value; }
}
public virtual string Domain
{
get { return domain; }
set { domain = value; }
}
}
這裏是我嘗試保存新的動態創建的條目:
ITransaction tx = session.BeginTransaction();
Site s = new Site();
s.Name = StringGenerator.RandomString(20) + " site";
s.Domains = new List<SiteDomain>();
s.Domains.Add(new SiteDomain { Site = s, Domain = StringGenerator.RandomString(20) + ".com" });
session.SaveOrUpdate(s);
tx.Commit();
現在我得到例外:
{ 「無法插入:[Project.Core.SiteDomain#0] [SQL:INSERT INTO sitedomains(域,SITEID,ID)VALUES(,,????)]」}:{「不能添加或 更新子行:外鍵約束失敗 (
project
。sitedomains
,約束FK_sitedomains_siteid
對外 KEY(siteid
)參考文獻site
(id
)ON DELETE CASCADE ON UPDATE CASCADE)「}
我把它做成包,它在某些部分有幫助。目前,我使用包,當我嘗試將網站保存到數據庫時,出現異常:[Project.Core.SiteDomain#0] [SQL:INSERT INTO sitedomains(Domain,ID)VALUES(?,?)]:{ 「Field'siteid'沒有默認值」}。我該如何處理這個問題? – kseen 2013-02-26 16:32:25
我更新了我的答案。問題出在您的siteid列的NOT NULL設置中。 – 2013-02-26 16:58:15
請查看我爲您更新的答案。同樣的例外。也許我們應該看看列生成器? – kseen 2013-02-26 17:15:54