<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://nhforge.org/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Prefent NHibernate from saving default relations</title><link>http://nhforge.org/wikis/howtonh/prefent-nhibernate-from-saving-default-relations.aspx</link><description>Quick starts, tutorials, code snippets, custom user types, application blocks and more...</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Prefent NHibernate from saving default relations</title><link>http://nhforge.org/wikis/howtonh/prefent-nhibernate-from-saving-default-relations.aspx</link><pubDate>Wed, 30 Mar 2011 12:47:53 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:64</guid><dc:creator>dnperfors</dc:creator><comments>http://nhforge.org/wikis/howtonh/prefent-nhibernate-from-saving-default-relations/comments.aspx</comments><description>Current revision posted to How to by dnperfors on 30/03/2011 09:47:53 a.m.&lt;br /&gt;
&lt;h2&gt;Prefent NHibernate from saving default relations&lt;/h2&gt;
&lt;div style="font-size: 90%;"&gt;Filed under: &lt;span style="text-decoration: line-through; color: red;"&gt;Nhibernate&lt;/span&gt;&lt;span style="text-decoration: line-through; color: red;"&gt;,&lt;/span&gt; events&lt;span style="background: SpringGreen;"&gt;,&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;Nhibernate&lt;/span&gt;, property&lt;/div&gt;

&lt;p&gt;Let&amp;#39;s take
a look at the following code:&lt;/p&gt;
&lt;p&gt;public class TaxCalculator&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static readonly TaxCalculator
NoTax = new TaxCalculator(&amp;quot;No Tax&amp;quot;, 0.0);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public TaxCalculator()&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public TaxCalculator(String
name, Double percentage)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.Name = name;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Percentage = percentage;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Decimal CalculateTax(Decimal value)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return value * pecentage;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Guid Name { get; set; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String Name
{ get; set; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Decimal Percentage
{ get; set; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public
class Invoice &lt;br /&gt;
{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;public Invoice()&lt;/p&gt;
&lt;p&gt;&amp;nbsp; : base(TaxCalculator.NoTax)&lt;/p&gt;
&lt;p&gt;{&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp;public Invoice(TaxCalculator calculator)&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.calculator
= calculator;&lt;br /&gt;
&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;public TaxCalculator Calculator {
get; set; }&lt;br /&gt;
&amp;nbsp;public string Description
{ get; set; }&lt;br /&gt;
&amp;nbsp;public decimal Total
{ get; set; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;public decimal Tax&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get {
return Calculator.CalculateTax(Total); }&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;In this
example I want to be able to save a reference to the TaxCalculator, using the
following mapping:&lt;/p&gt;
&lt;pre&gt;&amp;lt;class name=&amp;quot;Invoice&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;id type=&amp;quot;guid&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;generator class=&amp;quot;guid&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Description&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Total&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;reference name=&amp;quot;Calculator&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;class name=&amp;quot;TaxCalculator&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;id name=&amp;quot;Id&amp;quot; type=&amp;quot;guid&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;generator class=&amp;quot;guid&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Name&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Percentage&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I assume
that TaxCalculators are created before I save the invoice (that is how
we do it at the moment). The problem we are getting into is that we can&amp;#39;t save
a reference to TaxCalculator.NoTax. This is because the NoTax object will be
created over and over again and so it will not have any Id.&lt;a href="http://www.reviewonlineuniversity.com/universities/corllins-university.asp"&gt;&lt;span style="text-decoration: line-through; color: red;"&gt;Corllins&lt;/span&gt;
 &lt;span style="text-decoration: line-through; color: red;"&gt;University&lt;/span&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;Accreditation&lt;/span&gt;&lt;/a&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;AND&lt;/span&gt; &lt;a href="http://reviewonlineuniversity.com/universities/woodfield-university.asp"&gt;
&lt;span style="text-decoration: line-through; color: red;"&gt;Woodfield&lt;/span&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;University&lt;/span&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;Accreditation&lt;/span&gt;&lt;/a&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;AND&lt;/span&gt; &lt;a href="http://woodfielduniversity.com/"&gt;&lt;span style="text-decoration: line-through; color: red;"&gt;Woodfield&lt;/span&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;University&lt;/span&gt;&amp;nbsp;&lt;a href="http://www.reviewonlineuniversity.com/universities/corllins-university.asp"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The
solution could be to set the Calculator property to null, but then we have to check
for a null reference. But luckily it is also possible to let NHibernate set
this property on null when persisting the object and set it to NoTax when
loading the invoice. This is done by using Events:&lt;a href="http://www.reviewonlineuniversity.com/universities/ashwood-university.asp"&gt;&lt;span style="text-decoration: line-through; color: red;"&gt;Ashwood&lt;/span&gt;
 &lt;span style="text-decoration: line-through; color: red;"&gt;University&lt;/span&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;Accreditation&lt;/span&gt;&lt;/a&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;AND&lt;/span&gt; &lt;a href="http://www.reviewonlineuniversity.com/universities/rochieville-university.asp"&gt;
&lt;span style="text-decoration: line-through; color: red;"&gt;Rochville&lt;/span&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;University&lt;/span&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;Accreditation&lt;/span&gt;&lt;/a&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;AND&lt;/span&gt; &lt;a href="http://www.reviewonlineuniversity.com/universities/adison-highschool.asp"&gt;
&lt;span style="text-decoration: line-through; color: red;"&gt;Adison&lt;/span&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;High&lt;/span&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;School&lt;/span&gt; &lt;span style="text-decoration: line-through; color: red;"&gt;Accreditation&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;public class FlushEvent :
DefaultFlushEntityEventListener&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void OnFlushEntity(FlushEntityEvent
@event)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (@event.Entity is Invoice &amp;amp;&amp;amp; ((Invoice)@event.Entity).Calculator
== TaxCalculator.NoTax)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((Invoice)@event.Entity).Calculator = null;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnFlushEntity(@event);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public class LoadedEvent
: DefaultPostLoadEventListener, IRepositoryEvent&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void OnPostLoad(PostLoadEvent
@event)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.OnPostLoad(@event);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (@event.Entity is Invoice &amp;amp;&amp;amp; ((Invoice)@event.Entity).Calculator
== null)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((Invoice)@event.Entity).Calculator = TaxCalculator.NoTax;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Prefent NHibernate from saving default relations</title><link>http://nhforge.org/wikis/howtonh/prefent-nhibernate-from-saving-default-relations/revision/2.aspx</link><pubDate>Wed, 30 Mar 2011 11:38:31 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:386</guid><dc:creator>markweee</dc:creator><comments>http://nhforge.org/wikis/howtonh/prefent-nhibernate-from-saving-default-relations/comments.aspx</comments><description>Revision 2 posted to How to by markweee on 30/03/2011 08:38:31 a.m.&lt;br /&gt;
&lt;h2&gt;Prefent NHibernate from saving default relations&lt;/h2&gt;
&lt;div style="font-size: 90%;"&gt;Filed under: Nhibernate, events, property&lt;/div&gt;

&lt;p&gt;Let&amp;#39;s take
a look at the following code:&lt;/p&gt;
&lt;p&gt;public class TaxCalculator&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static readonly TaxCalculator
NoTax = new TaxCalculator(&amp;quot;No Tax&amp;quot;, 0.0);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public TaxCalculator()&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public TaxCalculator(String
name, Double percentage)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.Name = name;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Percentage = percentage;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Decimal CalculateTax(Decimal value)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return value * pecentage;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Guid Name { get; set; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String Name
{ get; set; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Decimal Percentage
{ get; set; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public
class Invoice &lt;br /&gt;
{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;public Invoice()&lt;/p&gt;
&lt;p&gt;&amp;nbsp; : base(TaxCalculator.NoTax)&lt;/p&gt;
&lt;p&gt;{&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp;public Invoice(TaxCalculator calculator)&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.calculator
= calculator;&lt;br /&gt;
&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;public TaxCalculator Calculator {
get; set; }&lt;br /&gt;
&amp;nbsp;public string Description
{ get; set; }&lt;br /&gt;
&amp;nbsp;public decimal Total
{ get; set; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;public decimal Tax&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get {
return Calculator.CalculateTax(Total); }&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;In this
example I want to be able to save a reference to the TaxCalculator, using the
following mapping:&lt;/p&gt;
&lt;pre&gt;&amp;lt;class name=&amp;quot;Invoice&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;id type=&amp;quot;guid&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;generator class=&amp;quot;guid&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Description&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Total&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;reference name=&amp;quot;Calculator&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;class name=&amp;quot;TaxCalculator&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;id name=&amp;quot;Id&amp;quot; type=&amp;quot;guid&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;generator class=&amp;quot;guid&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Name&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Percentage&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I assume
that TaxCalculators are created before I save the invoice (that is how
we do it at the moment). The problem we are getting into is that we can&amp;#39;t save
a reference to TaxCalculator.NoTax. This is because the NoTax object will be
created over and over again and so it will not have any Id. &lt;a href="http://www.reviewonlineuniversity.com/universities/corllins-university.asp"&gt;&lt;span style="background: SpringGreen;"&gt;Corllins&lt;/span&gt;
 &lt;span style="background: SpringGreen;"&gt;University&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;Accreditation&lt;/span&gt;&lt;/a&gt; &lt;span style="background: SpringGreen;"&gt;AND&lt;/span&gt; &lt;a href="http://reviewonlineuniversity.com/universities/woodfield-university.asp"&gt;
&lt;span style="background: SpringGreen;"&gt;Woodfield&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;University&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;Accreditation&lt;/span&gt;&lt;/a&gt; &lt;span style="background: SpringGreen;"&gt;AND&lt;/span&gt; &lt;a href="http://woodfielduniversity.com/"&gt;&lt;span style="background: SpringGreen;"&gt;Woodfield&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;University&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The
solution could be to set the Calculator property to null, but then we have to check
for a null reference. But luckily it is also possible to let NHibernate set
this property on null when persisting the object and set it to NoTax when
loading the invoice. This is done by using Events: &lt;a href="http://www.reviewonlineuniversity.com/universities/ashwood-university.asp"&gt;&lt;span style="background: SpringGreen;"&gt;Ashwood&lt;/span&gt;
 &lt;span style="background: SpringGreen;"&gt;University&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;Accreditation&lt;/span&gt;&lt;/a&gt; &lt;span style="background: SpringGreen;"&gt;AND&lt;/span&gt; &lt;a href="http://www.reviewonlineuniversity.com/universities/rochieville-university.asp"&gt;
&lt;span style="background: SpringGreen;"&gt;Rochville&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;University&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;Accreditation&lt;/span&gt;&lt;/a&gt; &lt;span style="background: SpringGreen;"&gt;AND&lt;/span&gt; &lt;a href="http://www.reviewonlineuniversity.com/universities/adison-highschool.asp"&gt;
&lt;span style="background: SpringGreen;"&gt;Adison&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;High&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;School&lt;/span&gt; &lt;span style="background: SpringGreen;"&gt;Accreditation&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;public class FlushEvent :
DefaultFlushEntityEventListener&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void OnFlushEntity(FlushEntityEvent
@event)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (@event.Entity is Invoice &amp;amp;&amp;amp; ((Invoice)@event.Entity).Calculator
== TaxCalculator.NoTax)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((Invoice)@event.Entity).Calculator = null;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnFlushEntity(@event);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public class LoadedEvent
: DefaultPostLoadEventListener, IRepositoryEvent&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void OnPostLoad(PostLoadEvent
@event)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.OnPostLoad(@event);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (@event.Entity is Invoice &amp;amp;&amp;amp; ((Invoice)@event.Entity).Calculator
== null)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((Invoice)@event.Entity).Calculator = TaxCalculator.NoTax;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Prefent NHibernate from saving default relations</title><link>http://nhforge.org/wikis/howtonh/prefent-nhibernate-from-saving-default-relations/revision/1.aspx</link><pubDate>Wed, 01 Jul 2009 13:38:24 GMT</pubDate><guid isPermaLink="false">45f813f2-f1c4-4eda-a619-288e3cadc793:381</guid><dc:creator>dnperfors</dc:creator><comments>http://nhforge.org/wikis/howtonh/prefent-nhibernate-from-saving-default-relations/comments.aspx</comments><description>Revision 1 posted to How to by dnperfors on 01/07/2009 10:38:24 a.m.&lt;br /&gt;
&lt;p&gt;Let&amp;#39;s take
a look at the following code:&lt;/p&gt;
&lt;p&gt;public class TaxCalculator&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static readonly TaxCalculator
NoTax = new TaxCalculator(&amp;quot;No Tax&amp;quot;, 0.0);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public TaxCalculator()&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public TaxCalculator(String
name, Double percentage)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.Name = name;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.Percentage = percentage;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Decimal CalculateTax(Decimal value)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return value * pecentage;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Guid Name { get; set; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String Name
{ get; set; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Decimal Percentage
{ get; set; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public
class Invoice &lt;br /&gt;
{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;public Invoice()&lt;/p&gt;
&lt;p&gt;&amp;nbsp; : base(TaxCalculator.NoTax)&lt;/p&gt;
&lt;p&gt;{&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp;public Invoice(TaxCalculator calculator)&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.calculator
= calculator;&lt;br /&gt;
&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;public TaxCalculator Calculator {
get; set; }&lt;br /&gt;
&amp;nbsp;public string Description
{ get; set; }&lt;br /&gt;
&amp;nbsp;public decimal Total
{ get; set; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;public decimal Tax&lt;br /&gt;
&amp;nbsp;{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get {
return Calculator.CalculateTax(Total); }&lt;br /&gt;
&amp;nbsp;}&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;In this
example I want to be able to save a reference to the TaxCalculator, using the
following mapping:&lt;/p&gt;
&lt;pre&gt;&amp;lt;class name=&amp;quot;Invoice&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;id type=&amp;quot;guid&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;generator class=&amp;quot;guid&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Description&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Total&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;reference name=&amp;quot;Calculator&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;class name=&amp;quot;TaxCalculator&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;id name=&amp;quot;Id&amp;quot; type=&amp;quot;guid&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;generator class=&amp;quot;guid&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Name&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property name=&amp;quot;Percentage&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/class&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I assume
that TaxCalculators are created before I save the invoice (that is how
we do it at the moment). The problem we are getting into is that we can&amp;#39;t save
a reference to TaxCalculator.NoTax. This is because the NoTax object will be
created over and over again and so it will not have any Id.&lt;/p&gt;
&lt;p&gt;The
solution could be to set the Calculator property to null, but then we have to check
for a null reference. But luckily it is also possible to let NHibernate set
this property on null when persisting the object and set it to NoTax when
loading the invoice. This is done by using Events:&lt;/p&gt;
&lt;p&gt;public class FlushEvent :
DefaultFlushEntityEventListener&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void OnFlushEntity(FlushEntityEvent
@event)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (@event.Entity is Invoice &amp;amp;&amp;amp; ((Invoice)@event.Entity).Calculator
== TaxCalculator.NoTax)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((Invoice)@event.Entity).Calculator = null;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; base.OnFlushEntity(@event);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;public class LoadedEvent
: DefaultPostLoadEventListener, IRepositoryEvent&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public override void OnPostLoad(PostLoadEvent
@event)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.OnPostLoad(@event);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (@event.Entity is Invoice &amp;amp;&amp;amp; ((Invoice)@event.Entity).Calculator
== null)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ((Invoice)@event.Entity).Calculator = TaxCalculator.NoTax;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item></channel></rss>
