<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>ORM</title>
        <link>http://www.shanghai-software.com/blog/category/14.aspx</link>
        <description>ORM</description>
        <language>en-AU</language>
        <copyright>Ben Kloosterman</copyright>
        <generator>Subtext Version 2.1.0.5</generator>
        <item>
            <title>LINQ for SQL unit testing Part2</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-unit-testing-part2.aspx</link>
            <description>&lt;p&gt;I'm not really sure whether the benefits are worth it unless you need very high quality code and for larger applications.   I'm not sure why i feel this and whether this is due to compartmentalizing the LINQ code or whether its just TDD on LINQ code which can be tested via a test DB i suspect its the TDD.  &lt;/p&gt;
&lt;p&gt;Still storing all the sql in the various repositories is a plus.&lt;/p&gt;
&lt;font size="2"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#008000" size="2"&gt;---------------------------------------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;internal&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceRepositry&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; : &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;RepositryBase&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IProvinceRepositry&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ProvinceRepositry()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;base&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;())&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ProvinceRepositry(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt; work)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;base&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;(work)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;#region&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; IProvinceRepositry Members&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceCollection&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; GetWorld(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; worldname)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;throw&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; System.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;NotImplementedException&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceCollection&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; GetWorld()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;throw&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; System.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;NotImplementedException&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Get(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; id)&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;throw&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; System.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;NotImplementedException&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Update(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; prov)&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Guard&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.ArgumentNotNull(prov, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&lt;font color="#a31515" size="2"&gt;"PROVINCE"&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;); &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Create(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; prov)&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Guard&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.ArgumentNotNull(prov, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&lt;font color="#a31515" size="2"&gt;"PROVINCE"&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;); &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;throw&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;new&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; System.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;NotImplementedException&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;();&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;: &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;: &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#endregion&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;-------------------------------------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;font size="2"&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#region&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;context.SubmitChanges(); &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#endregion&lt;/p&gt;
&lt;p&gt;#region&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;context.Dispose();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;#endregion&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;internal&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; :&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;UnitOfWorkBase&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;, &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IUnitOfWork&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;DataContext&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; context;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ProvinceUnitOfWork()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;this&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;.context = &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;DataContextFactory&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;DataClassesDataContext&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&amp;gt;.GetThreadScopedDataContext(); ; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2"&gt; IUnitofWork&amp;lt;World&amp;gt; Members&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;bool&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; ReadOnly { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;get&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; { &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;return&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; !context.ObjectTrackingEnabled; } &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;set&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; { context.ObjectTrackingEnabled = !&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;value&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;; } }&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; SubmitChanges()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2"&gt; IDisposable Members&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;override&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Dispose()&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2" /&gt;&lt;/font&gt;&lt;font size="2" /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;internal&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;interface&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;IProvinceRepositry&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceCollection&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; GetWorld(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;string&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; worldname);&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;ProvinceCollection&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; GetWorld();&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Get(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; id);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Update(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; prov);&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; Create(&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;&lt;font color="#2b91af" size="2"&gt;Province&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt; prov); &lt;/font&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/15.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-unit-testing-part2.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 16:38:38 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/15.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/15/linq-for-sql-unit-testing-part2.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/15.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/15.aspx</trackback:ping>
        </item>
        <item>
            <title>OO with services </title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/14/oo-with-services.aspx</link>
            <description>&lt;p&gt;Are OO code and SOA diametrically opposed ? In a lot of ways this is true services tend to produce very anemic object models however this merely reduces reuse which is a myth in OO for the majority anyway . &lt;/p&gt;
&lt;p&gt;However services have a unique but familiar problem . The contract of the service is critical it needs to be designed for &lt;/p&gt;
&lt;p&gt; - The ease of use of the client  &lt;/p&gt;
&lt;p&gt;- For performance  ( ie chunky calls , many small calls can bring many services down to its needs) &lt;/p&gt;
&lt;p&gt;- To be upgradeable and allow backward compatibility.&lt;/p&gt;
&lt;p&gt;- Compatible with an XML schema ( eg generics and interfaces create problems) &lt;/p&gt;
&lt;p&gt;- Best to be compatible with WS standards and non &lt;a rel="" href="http://74.55.152.210/blog/WCF" title="WCF"&gt;Windows Communication Foundation&lt;/a&gt; clients ( eg nullable datetime ,  no char , long etc ) &lt;/p&gt;
&lt;p&gt;- Only sub object and collections needed for this call need to be propagated which is not all the objects and collections a object may contain.  eg Order GetOrder(..) may contain OrderItems which contain Products but no more information about the product such as supplier etc . This is best described as truncated trees. &lt;/p&gt;
&lt;p&gt;( see how to write a good contract) &lt;/p&gt;
&lt;p&gt;This is dramatically different from an OO structure  where ease of use is not high on the list else we would all be using statics , however its very similar to a relational database and its structure. &lt;/p&gt;
&lt;p&gt;Does this mean services are similar to databases ( eg Procedural Programming)  ? From the outside yes and smaller services probably should remain Procedural and non OO . (A good example is in the LINQ and services article)&lt;/p&gt;
&lt;p&gt;However larger services should retain a significant OO core with a focus on code quality , testability and maintainability however this requires a reverse ORM which maps from the messages to the internal logic.  Microsofts P&amp;amp;P Web service factory includes converterts exactly for this purposes and its a good pattern to follow. &lt;/p&gt;
&lt;p&gt;Even in small services when mapping from a  DB to messages there is a case for such a conversion layer ( and DTOs)  . Take the case of LINQ for sql if you add a member to  a DB table for some new functionality meant to be visible to a select group do you want every client to now have this information in the data sent down  ?  If custom message contracts were used only the new operation and contract used by the select group would get the new information however all the logic would be common ( just the privileged data would not be copied to contract) . If custom message contracts are not used the team would be forced to create a new schema copy of the data for the same table which would be identical  except for the one member as can be seen over time this would reduce maintainability of the service . &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/12.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/14/oo-with-services.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 15:33:15 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/12.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/14/oo-with-services.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/12.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/12.aspx</trackback:ping>
        </item>
        <item>
            <title>LINQ for SQL and reattaching objects in nTier scenarios</title>
            <link>http://www.shanghai-software.com/blog/archive/2009/01/14/linq-for-sql-and-reattaching-objects-in-ntier-scenarios.aspx</link>
            <description>&lt;p&gt;One of the issues that keeps cropping up is LINQ for SQLs support for nTier scenarios and having to reattach the object to the DataContext. &lt;/p&gt;
&lt;p&gt;However this problem is exhibited by all ORMs in nTier scenarios ( though not in web sites) and  you basically have 2 choices &lt;/p&gt;
&lt;p&gt;- refetch the object from cache/DB and replay all changes to see what has changed then you can craft a custom Update to just change the items changed. &lt;/p&gt;
&lt;p&gt;- update all fields in the DB. &lt;/p&gt;
&lt;p&gt;While the 2nd method is easier the first is more efficient especially when you consider that it is very likely that the object is still in a cache. &lt;/p&gt;
&lt;p&gt;In both cases a row version/timestamp is normally required for concurrency .&lt;/p&gt;
&lt;p&gt; ProcessOrder ( Order order) &lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;var orderDB = ThreadDataContext.Context; //get dataContext&lt;br /&gt;
//Products is the table we draged and dropped in the dbml designer&lt;br /&gt;
var _oldOrder = (from _orders in order.Orders&lt;/font&gt;&lt;font face="Arial"&gt;           &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;select _order where _order.id =  order.id).Single();&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;//note as you have the old order and new order you can apply some logic , this is much more efficient than doing it in a db &lt;/p&gt;
&lt;p&gt;if ( &lt;font face="Arial"&gt;_oldOrder.IsFinalized())&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;   throw new InvalidOperationException("Finalized order cant be changed");&lt;/p&gt;
&lt;p&gt;if ( _OldOrder.RowVer != _order.RowVer) &lt;/p&gt;
&lt;p&gt;   throw new ConcurrencyException("Order already Changed") ;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;//update the fields&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;_oldOrder .Number = order.Number; &lt;br /&gt;
&lt;font face="Arial"&gt;_oldOrder .CustomerId = order.CustomerId; &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;// etc ...&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;new BLL.OrderProcessor().Process(&lt;font face="Arial"&gt;_oldOrder);  //process &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;You could use reflection to automate the copying and then the new order would just overwrite the previous order but this has 2 issues&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;It would be slow &lt;/li&gt;
    &lt;li&gt;It would allow the client  to trash the servers object by serializing  on top of it . &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is also worth noting for medium and large services you are likely to have an internal object module and code to convert from messages to internal code anyway ( see OO with services article) &lt;/p&gt;
&lt;p&gt;I think fetching the old order is good business practice anyway and stops issues like a client bug updatting a service and trashing a fulfilled order with a new one .  Fetching the old order allows you to uphold one of the SOA tennats/rules that a service should never trust a client .&lt;/p&gt;
&lt;p&gt;It is worth noting the same thing needs to be done for member objects or collections and hence its usefull to provide some simple converter classes for each type .  The result of this is that services ( that write to a DB) using an ORM tend to have an external message structure  different from the internal OO representation even when the OO model and service is quite small.  Even though this is a burden it does not introduce a lot of time or any complexity and is a good practice to follow for all but the smallest services anyway. ( Again see OO with services article) &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://www.shanghai-software.com/blog/aggbug/10.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ben Kloosterman</dc:creator>
            <guid>http://www.shanghai-software.com/blog/archive/2009/01/14/linq-for-sql-and-reattaching-objects-in-ntier-scenarios.aspx</guid>
            <pubDate>Wed, 14 Jan 2009 15:00:23 GMT</pubDate>
            <wfw:comment>http://www.shanghai-software.com/blog/comments/10.aspx</wfw:comment>
            <comments>http://www.shanghai-software.com/blog/archive/2009/01/14/linq-for-sql-and-reattaching-objects-in-ntier-scenarios.aspx#feedback</comments>
            <wfw:commentRss>http://www.shanghai-software.com/blog/comments/commentRss/10.aspx</wfw:commentRss>
            <trackback:ping>http://www.shanghai-software.com/blog/services/trackbacks/10.aspx</trackback:ping>
        </item>
    </channel>
</rss>