I have the following db tables which I have simplified for this example:
Webpage Id, URLIdentifier
WebpageMetaData strong> Webpage Keywords
Webpage_id is the main key for the table, and the foriegn key is for the table of the web page.
Then I use Fluent NHibernate and its auto-tuning function to map them to the following POCO classes:
public class Webpage
{
public virtual int Id { get; set; }
public virtual string UrlIdentifier { get; set; }
public virtual WebpageMetaData WebpageMetaData { get; set; }
}
public class WebpageMetaData
{
public virtual int Id { get; set; }
public virtual string Keywords{ get; set; }
public virtual Webpage Webpage { get; set; }
}
I want to map these objects as one-to-one, so I redefine automation as follows:
public class WebpageMap : IAutoMappingOverride<Webpage>
{
public void Override(AutoMapping<Webpage> mapping)
{
mapping.HasOne(w => w.WebpageMetaData)
.Not.Constrained()
.Fetch.Join()
.Cascade.All();
}
}
public class WebpageMetaDataMap : IAutoMappingOverride<WebpageMetaData>
{
public void Override(AutoMapping<WebpageMetaData> mapping)
{
mapping.Id(w => w.Id, "Webpage_id").GeneratedBy.Foreign("Webpage");
mapping.HasOne(w => w.Webpage)
.ForeignKey("Webpage_id")
.Constrained()
.Fetch.Join()
.Cascade.None();
}
}
I tested these mappings and cascading rules, and they work to select, insert, and update. However, when I perform the removal of WebpageMetaData, I get an exception saying that
" cascade ( ) [WebpageMetaData # 524]"
- :
webpageMetaData.Webpage.WebpageMetaData = null;
, ??! ? ?
.
1:
NH-, FLuent, , NHibernator:)
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="EveryPage.Core.Domain.Webpage, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Webpage`">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
<column name="Id" />
<generator class="identity" />
</id>
<one-to-one cascade="all" class="EveryPage.Core.Domain.WebpageMetaData, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" constrained="false" fetch="join" name="WebpageMetaData" />
<property name="UrlIdentifier" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="UrlIdentifier" />
</property>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="EveryPage.Core.Domain.WebpageMetaData, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`WebpageMetaData`">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
<column name="Webpage_id" />
<generator class="foreign">
<param name="property">Webpage</param>
</generator>
</id>
<one-to-one cascade="none" class="EveryPage.Core.Domain.Webpage, EveryPage.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" constrained="true" fetch="join" foreign-key="Webpage_id" name="Webpage" />
<property name="Keywords" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Keywords" />
</property>
</class>
</hibernate-mapping>