<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Pavel&#039;s Blog</title>
	<atom:link href="http://pavelfedulov.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://pavelfedulov.wordpress.com</link>
	<description>Just another blog about software development</description>
	<lastBuildDate>Wed, 16 Jun 2010 10:11:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='pavelfedulov.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Pavel&#039;s Blog</title>
		<link>http://pavelfedulov.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://pavelfedulov.wordpress.com/osd.xml" title="Pavel&#039;s Blog" />
	<atom:link rel='hub' href='http://pavelfedulov.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Entity Framework context wrapper</title>
		<link>http://pavelfedulov.wordpress.com/2010/06/15/entity-framework-context-wrapper/</link>
		<comments>http://pavelfedulov.wordpress.com/2010/06/15/entity-framework-context-wrapper/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 19:43:53 +0000</pubDate>
		<dc:creator>Pavel Fedulov</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[entity framework]]></category>
		<category><![CDATA[orm]]></category>

		<guid isPermaLink="false">http://pavelfedulov.wordpress.com/?p=7</guid>
		<description><![CDATA[Due to a strong will of our customer on my current project we have to use Entity Framework as ORM. There are many drawbacks in it, I am not going to post complains. The biggest problem for me is that I am unable to mock entity framework context for unit-testing. To make mocking convinient, a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pavelfedulov.wordpress.com&amp;blog=12392924&amp;post=7&amp;subd=pavelfedulov&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Due to a strong will of our customer on my current project we have to use Entity Framework as ORM. There are many drawbacks in it, I am not going to post complains. The biggest problem for me is that I am unable to mock entity framework context for unit-testing. To make mocking convinient, a class must implement an interface. With an interface one can create different implementation for test purposes. It could be in-memory virtual database which makes it easy to emulate different cases and works very fast. I used to work with Linq to SQL and there was quite easy way to wrap it in an interface. With Entity Framework things are more difficult. Linq to SQL uses generics a lot, while entity framework just generates dumb properties and methods for entity collections and uses string hardcoding a lot instead of generics. So, one day,I decided to solve this for myself.<span id="more-7"></span></p>
<p>I must also admit, that I use layered architecture and a very complicated meta-data based authorization. I cannot let top layer access datacontext directly. Top layer consumes some repository interface implementation that could actually be a secured proxy to the datacontext wrapper. This solutions also makes this possible to be implemented.</p>
<p>Here&#8217;s the interface:</p>
<pre class="csharp" style="font-family:monospace;"><span style="color:#0600ff;">using</span> <span style="color:#008080;">System</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Collections.Generic</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Data.Objects.DataClasses</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Linq.Expressions</span><span style="color:#008000;">;</span>

<span style="color:#0600ff;">namespace</span> Common.<span style="color:#0000ff;">DAL</span>
<span style="color:#000000;">{</span>
    <span style="color:#0600ff;">public</span> <span style="color:#ff0000;">interface</span> IRepository <span style="color:#008000;">:</span> IDisposable
    <span style="color:#000000;">{</span>
        IList<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject<span style="color:#008000;">;</span>
        IList<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>DataLoadOptions dlo<span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject<span style="color:#008000;">;</span>
        IList<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>Expression<span style="color:#008000;">&lt;</span>Func<span style="color:#008000;">&lt;</span>T, <span style="color:#ff0000;">bool</span><span style="color:#008000;">&gt;&gt;</span> predicate<span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject<span style="color:#008000;">;</span>
        IList<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>Expression<span style="color:#008000;">&lt;</span>Func<span style="color:#008000;">&lt;</span>T, <span style="color:#ff0000;">bool</span><span style="color:#008000;">&gt;&gt;</span> predicate, DataLoadOptions dlo<span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject<span style="color:#008000;">;</span>
        <span style="color:#0600ff;">void</span> Add<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>T entity<span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject<span style="color:#008000;">;</span>
        <span style="color:#0600ff;">void</span> Remove<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>T entity<span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject<span style="color:#008000;">;</span>
        <span style="color:#0600ff;">void</span> Save<span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
    <span style="color:#000000;">}</span>
<span style="color:#000000;">}</span></pre>
<p>Here we have several Get method overloads for convinience. Get method accepts a predicate and return IList. From the top level you can only pass you predicate, no more query changes later. In the lower layers the predicate can be analyzed or get more complicated for security reasons.</p>
<p>As you notice there is also a parameter of type DataLoadOptions. This stuff is needed to make joins in Linq to SQL style instead of string hardcoding so loved in Entity Framework. This class implementation will be shown in the end.</p>
<p>Save method is intended to be called when we want to submit all current changes to database.</p>
<p>Here is the class implementation:</p>
<pre class="csharp" style="font-family:monospace;"><span style="color:#0600ff;">using</span> <span style="color:#008080;">System</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Collections.Generic</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Data</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Data.Objects</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Data.Objects.DataClasses</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Linq</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Linq.Expressions</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">RefreshMode</span><span style="color:#008000;">=</span><span style="color:#000000;">System.<span style="color:#0000ff;">Data</span></span>.<span style="color:#0000ff;">Objects</span>.<span style="color:#0000ff;">RefreshMode</span><span style="color:#008000;">;</span>

<span style="color:#0600ff;">namespace</span> Common.<span style="color:#0000ff;">DAL</span>
<span style="color:#000000;">{</span>
    <span style="color:#0600ff;">public</span> <span style="color:#ff0000;">class</span> EntityFrameworkWrapperRepository <span style="color:#008000;">:</span> IRepository
    <span style="color:#000000;">{</span>
        <span style="color:#0600ff;">private</span> ObjectContext _db<span style="color:#008000;">;</span>
        <span style="color:#0600ff;">public</span> <span style="color:#ff0000;">bool</span> AutoSaveOnDispose <span style="color:#000000;">{</span> get<span style="color:#008000;">;</span> <span style="color:#0600ff;">private</span> set<span style="color:#008000;">;</span> <span style="color:#000000;">}</span>
        <span style="color:#0600ff;">public</span> <span style="color:#ff0000;">bool</span> AutoRefreshAfterSave <span style="color:#000000;">{</span> get<span style="color:#008000;">;</span> <span style="color:#0600ff;">private</span> set<span style="color:#008000;">;</span> <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">public</span> EntityFrameworkWrapperRepository<span style="color:#000000;">(</span>ObjectContext objectContext, <span style="color:#ff0000;">bool</span> autoRefreshAfterSave<span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>objectContext <span style="color:#008000;">==</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> ArgumentNullException<span style="color:#000000;">(</span><span style="color:#666666;">"objectContext"</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            AutoSaveOnDispose <span style="color:#008000;">=</span> false<span style="color:#008000;">;</span>
            AutoRefreshAfterSave <span style="color:#008000;">=</span> autoRefreshAfterSave<span style="color:#008000;">;</span>
            _db <span style="color:#008000;">=</span> objectContext<span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#008080;">#region Implementation of IRepository</span>

        <span style="color:#0600ff;">public</span> IList<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">return</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>t <span style="color:#008000;">=&gt;</span> <span style="color:#0600ff;">true</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">public</span> IList<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>DataLoadOptions dlo<span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">return</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>t <span style="color:#008000;">=&gt;</span> <span style="color:#0600ff;">true</span>, dlo<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">public</span> IList<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>Expression<span style="color:#008000;">&lt;</span>Func<span style="color:#008000;">&lt;</span>T, <span style="color:#ff0000;">bool</span><span style="color:#008000;">&gt;&gt;</span> predicate<span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">return</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>predicate, <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">public</span> IList<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span> Get<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>Expression<span style="color:#008000;">&lt;</span>Func<span style="color:#008000;">&lt;</span>T, <span style="color:#ff0000;">bool</span><span style="color:#008000;">&gt;&gt;</span> predicate, DataLoadOptions dlo<span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>_disposed<span style="color:#000000;">)</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> ObjectDisposedException<span style="color:#000000;">(</span>GetType<span style="color:#000000;">(</span><span style="color:#000000;">)</span>.<span style="color:#0000ff;">ToString</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            <span style="color:#008080;font-style:italic;">//looking for entityset type</span>
            var entitySetType <span style="color:#008000;">=</span> ResolveEntitySetType<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            var propertyType <span style="color:#008000;">=</span> <span style="color:#008000;">typeof</span><span style="color:#000000;">(</span>ObjectQuery<span style="color:#008000;">&lt;&gt;</span><span style="color:#000000;">)</span>.<span style="color:#0000ff;">MakeGenericType</span><span style="color:#000000;">(</span><span style="color:#008000;">new</span><span style="color:#000000;">[</span><span style="color:#000000;">]</span> <span style="color:#000000;">{</span> entitySetType <span style="color:#000000;">}</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            var pi <span style="color:#008000;">=</span> _db.<span style="color:#0000ff;">GetType</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>.<span style="color:#0000ff;">GetProperties</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>
                .<span style="color:#0000ff;">Where</span><span style="color:#000000;">(</span>p <span style="color:#008000;">=&gt;</span> p.<span style="color:#0000ff;">PropertyType</span> <span style="color:#008000;">==</span> propertyType<span style="color:#000000;">)</span>
                .<span style="color:#0000ff;">FirstOrDefault</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>pi <span style="color:#008000;">==</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> InvalidOperationException<span style="color:#000000;">(</span><span style="color:#666666;">"EntitySet not found"</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            var entitySet <span style="color:#008000;">=</span> pi.<span style="color:#0000ff;">GetValue</span><span style="color:#000000;">(</span>_db, <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>dlo <span style="color:#008000;">!=</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">foreach</span> <span style="color:#000000;">(</span>var member <span style="color:#0600ff;">in</span> dlo.<span style="color:#0000ff;">GetPreloadedMembers</span><span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
                <span style="color:#000000;">{</span>
                    var includeMethod <span style="color:#008000;">=</span> propertyType
                        .<span style="color:#0000ff;">GetMethod</span><span style="color:#000000;">(</span><span style="color:#666666;">"Include"</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

                    entitySet <span style="color:#008000;">=</span> includeMethod.<span style="color:#0000ff;">Invoke</span><span style="color:#000000;">(</span>entitySet, <span style="color:#008000;">new</span><span style="color:#000000;">[</span><span style="color:#000000;">]</span> <span style="color:#000000;">{</span>member.<span style="color:#0000ff;">Name</span><span style="color:#000000;">}</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
                <span style="color:#000000;">}</span>
            <span style="color:#000000;">}</span>

            <span style="color:#008080;font-style:italic;">//get the exact child class</span>
            var ofTypeMethod <span style="color:#008000;">=</span> propertyType
                .<span style="color:#0000ff;">GetMethod</span><span style="color:#000000;">(</span><span style="color:#666666;">"OfType"</span><span style="color:#000000;">)</span>
                .<span style="color:#0000ff;">MakeGenericMethod</span><span style="color:#000000;">(</span><span style="color:#008000;">new</span><span style="color:#000000;">[</span><span style="color:#000000;">]</span> <span style="color:#000000;">{</span> <span style="color:#008000;">typeof</span><span style="color:#000000;">(</span>T<span style="color:#000000;">)</span> <span style="color:#000000;">}</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            <span style="color:#0600ff;">return</span> <span style="color:#000000;">(</span><span style="color:#000000;">(</span>IQueryable<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">)</span>ofTypeMethod.<span style="color:#0000ff;">Invoke</span><span style="color:#000000;">(</span>entitySet, <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
                .<span style="color:#0000ff;">Where</span><span style="color:#000000;">(</span>predicate<span style="color:#000000;">)</span>
                .<span style="color:#0000ff;">ToList</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">public</span> <span style="color:#0600ff;">void</span> Add<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>T entity<span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>_disposed<span style="color:#000000;">)</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> ObjectDisposedException<span style="color:#000000;">(</span>GetType<span style="color:#000000;">(</span><span style="color:#000000;">)</span>.<span style="color:#0000ff;">ToString</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>entity <span style="color:#008000;">==</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> ArgumentNullException<span style="color:#000000;">(</span><span style="color:#666666;">"entity"</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            var entitySetType <span style="color:#008000;">=</span> ResolveEntitySetType<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            var addMethod <span style="color:#008000;">=</span> _db.<span style="color:#0000ff;">GetType</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>.<span style="color:#0000ff;">GetMethods</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>
                .<span style="color:#0000ff;">Where</span><span style="color:#000000;">(</span>m <span style="color:#008000;">=&gt;</span> m.<span style="color:#0000ff;">Name</span>.<span style="color:#0000ff;">StartsWith</span><span style="color:#000000;">(</span><span style="color:#666666;">"Add"</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
                .<span style="color:#0000ff;">Where</span><span style="color:#000000;">(</span>m <span style="color:#008000;">=&gt;</span> m.<span style="color:#0000ff;">GetParameters</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>
                                .<span style="color:#0000ff;">Where</span><span style="color:#000000;">(</span>p <span style="color:#008000;">=&gt;</span> p.<span style="color:#0000ff;">ParameterType</span> <span style="color:#008000;">==</span> entitySetType<span style="color:#000000;">)</span>.<span style="color:#0000ff;">Count</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span> <span style="color:#008000;">==</span> <span style="color:#ff0000;">1</span><span style="color:#000000;">)</span>
                .<span style="color:#0000ff;">FirstOrDefault</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>addMethod <span style="color:#008000;">==</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> InvalidOperationException<span style="color:#000000;">(</span><span style="color:#666666;">"Add method not found"</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            addMethod.<span style="color:#0000ff;">Invoke</span><span style="color:#000000;">(</span>_db, <span style="color:#008000;">new</span> <span style="color:#000000;">[</span><span style="color:#000000;">]</span><span style="color:#000000;">{</span>entity<span style="color:#000000;">}</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">public</span> <span style="color:#0600ff;">void</span> Remove<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>T entity<span style="color:#000000;">)</span> where T <span style="color:#008000;">:</span> EntityObject
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>_disposed<span style="color:#000000;">)</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> ObjectDisposedException<span style="color:#000000;">(</span>GetType<span style="color:#000000;">(</span><span style="color:#000000;">)</span>.<span style="color:#0000ff;">ToString</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            _db.<span style="color:#0000ff;">DeleteObject</span><span style="color:#000000;">(</span>entity<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">public</span> <span style="color:#0600ff;">void</span> Save<span style="color:#000000;">(</span><span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>_disposed<span style="color:#000000;">)</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> ObjectDisposedException<span style="color:#000000;">(</span>GetType<span style="color:#000000;">(</span><span style="color:#000000;">)</span>.<span style="color:#0000ff;">ToString</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>AutoRefreshAfterSave<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                var changedEntities <span style="color:#008000;">=</span> _db.<span style="color:#0000ff;">ObjectStateManager</span>
                    .<span style="color:#0000ff;">GetObjectStateEntries</span><span style="color:#000000;">(</span>EntityState.<span style="color:#0000ff;">Added</span> <span style="color:#008000;">|</span> EntityState.<span style="color:#0000ff;">Modified</span><span style="color:#000000;">)</span>
                    .<span style="color:#0000ff;">Where</span><span style="color:#000000;">(</span>e <span style="color:#008000;">=&gt;</span> e.<span style="color:#0000ff;">Entity</span> <span style="color:#008000;">!=</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span>
                    .<span style="color:#0000ff;">Select</span><span style="color:#000000;">(</span>e <span style="color:#008000;">=&gt;</span> e.<span style="color:#0000ff;">Entity</span><span style="color:#000000;">)</span>.<span style="color:#0000ff;">ToList</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

                _db.<span style="color:#0000ff;">SaveChanges</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

                changedEntities.<span style="color:#0600ff;">ForEach</span><span style="color:#000000;">(</span>e <span style="color:#008000;">=&gt;</span> _db.<span style="color:#0000ff;">Refresh</span><span style="color:#000000;">(</span>RefreshMode.<span style="color:#0000ff;">StoreWins</span>, e<span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
            <span style="color:#0600ff;">else</span>
            <span style="color:#000000;">{</span>
                _db.<span style="color:#0000ff;">SaveChanges</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">private</span> Type ResolveEntitySetType<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            var objectType <span style="color:#008000;">=</span> <span style="color:#008000;">typeof</span><span style="color:#000000;">(</span>T<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#0600ff;">while</span> <span style="color:#000000;">(</span>objectType.<span style="color:#0000ff;">BaseType</span> <span style="color:#008000;">!=</span> <span style="color:#008000;">typeof</span><span style="color:#000000;">(</span>EntityObject<span style="color:#000000;">)</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                objectType <span style="color:#008000;">=</span> objectType.<span style="color:#0000ff;">BaseType</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
            <span style="color:#0600ff;">return</span> objectType<span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#008080;">#endregion</span>

        <span style="color:#008080;">#region Implementation of IDisposable</span>

        <span style="color:#0600ff;">private</span> <span style="color:#ff0000;">bool</span> _disposed<span style="color:#008000;">;</span>

        <span style="color:#0600ff;">protected</span> <span style="color:#0600ff;">virtual</span> <span style="color:#0600ff;">void</span> Dispose<span style="color:#000000;">(</span><span style="color:#ff0000;">bool</span> disposing<span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span><span style="color:#008000;">!</span>_disposed<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>disposing<span style="color:#000000;">)</span>
                <span style="color:#000000;">{</span>
                    <span style="color:#0600ff;">if</span><span style="color:#000000;">(</span>AutoSaveOnDispose<span style="color:#000000;">)</span>
                        Save<span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

                    _db.<span style="color:#0000ff;">Dispose</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
                <span style="color:#000000;">}</span>

                _db <span style="color:#008000;">=</span> null<span style="color:#008000;">;</span>
                _disposed <span style="color:#008000;">=</span> true<span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>

        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">public</span> <span style="color:#0600ff;">void</span> Dispose<span style="color:#000000;">(</span><span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            Dispose<span style="color:#000000;">(</span><span style="color:#0600ff;">true</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            GC.<span style="color:#0000ff;">SuppressFinalize</span><span style="color:#000000;">(</span><span style="color:#0600ff;">this</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        ~EntityFrameworkWrapperRepository<span style="color:#000000;">(</span><span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            Dispose<span style="color:#000000;">(</span><span style="color:#0600ff;">false</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#008080;">#endregion        </span>
    <span style="color:#000000;">}</span>
<span style="color:#000000;">}</span></pre>
<p>The constructor accepts two parameters. The ObjectContext is the context to wrap, flag autoRefreshAfterSave is needed in case when you are using stored procedures to publish changes to the database and you&#8217;ve got some database generated values like rowversion. Without autorefresh these fields won&#8217;t be picked up by the EntityFramework.</p>
<p>Here I implement the interface. Reflection is needed a lot to make life better. In get method we first must figure out the entity set type. If an entity is a child in some inheritance hierarchy, then it&#8217;s entity set is of type of it&#8217;s most base class in entity hierarchy. This is solved recursively in ResolveEntitySetType method. After that I call Include method to make all needed joins. Remembering inheritance I call OfType method to specify that we want to get the type that was passed to us in method call. After all I apply the predicate.</p>
<p>In the Add method I also figure out the entity set type an look for an Add method in ObjectContext accepting this type parameter.</p>
<p>Remove is easy.</p>
<p>Save method has some tricky stuff. As mentioned earlier in some cases we&#8217;ve got to refresh entities after saving to database. To accomplish that I pick up the change set, call the SaveChanges method and then refresh all entities in the change set.</p>
<p>In the end I implement the Disposable pattern and that&#8217;s it!</p>
<p>If you are using POCOs, it will be easy to implement another wrapper to handle them. Probably later I&#8217;ll make a post about that, as soon as we move to .Net 4.</p>
<p>There are also things I&#8217;d like to improve. Reflection look-ups are done for each method call. This hits performance. To improve that I will probably do ObjectContext investigation in the constructor in advance and put EntitySet properties and Add methods to hashtables so that they would be found more quick later.</p>
<p>Almost forgot! The DataLoadOptions. I took the code from this post <a href="http://mosesofegypt.net/post/Introducing-DataLoadOptions-for-Entity-Framework-ObjectContext.aspx">http://mosesofegypt.net/post/Introducing-DataLoadOptions-for-Entity-Framework-ObjectContext.aspx</a> I really like the Linq to SQL style. But it has a drawback too. With this class you can only make joins to the first circle of references. Probably later I&#8217;ll improve that.</p>
<p>Here&#8217;s the class:</p>
<pre class="csharp" style="font-family:monospace;"><span style="color:#0600ff;">using</span> <span style="color:#008080;">System</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Collections</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Collections.Generic</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Linq</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Linq.Expressions</span><span style="color:#008000;">;</span>
<span style="color:#0600ff;">using</span> <span style="color:#008080;">System.Reflection</span><span style="color:#008000;">;</span>

<span style="color:#0600ff;">namespace</span> Common.<span style="color:#0000ff;">DAL</span>
<span style="color:#000000;">{</span>
    <span style="color:#0600ff;">public</span> <span style="color:#ff0000;">class</span> DataLoadOptions
    <span style="color:#000000;">{</span>
        <span style="color:#0600ff;">private</span> <span style="color:#0600ff;">static</span> <span style="color:#0600ff;">readonly</span> <span style="color:#ff0000;">string</span><span style="color:#000000;">[</span><span style="color:#000000;">]</span> ValidTypes <span style="color:#008000;">=</span> <span style="color:#008000;">new</span><span style="color:#000000;">[</span><span style="color:#000000;">]</span> <span style="color:#000000;">{</span> <span style="color:#666666;">"ComplexObject "</span>, <span style="color:#666666;">"StructuralObject"</span>, <span style="color:#666666;">"EntityObject"</span>, <span style="color:#666666;">"EntityCollection`1"</span> <span style="color:#000000;">}</span><span style="color:#008000;">;</span>
        <span style="color:#0600ff;">private</span> <span style="color:#0600ff;">readonly</span> Dictionary<span style="color:#008000;">&lt;</span>MetaPosition, MemberInfo<span style="color:#008000;">&gt;</span> _includes<span style="color:#008000;">;</span>

        <span style="color:#0600ff;">public</span> DataLoadOptions<span style="color:#000000;">(</span><span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            _includes <span style="color:#008000;">=</span> <span style="color:#008000;">new</span> Dictionary<span style="color:#008000;">&lt;</span>MetaPosition, MemberInfo<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">public</span> MemberInfo<span style="color:#000000;">[</span><span style="color:#000000;">]</span> GetPreloadedMembers<span style="color:#008000;">&lt;</span>TEntity<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            var type <span style="color:#008000;">=</span> <span style="color:#008000;">typeof</span><span style="color:#000000;">(</span>TEntity<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            var preloadedMembers <span style="color:#008000;">=</span> <span style="color:#008000;">new</span> List<span style="color:#008000;">&lt;</span>MemberInfo<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            <span style="color:#0600ff;">foreach</span> <span style="color:#000000;">(</span>var prop <span style="color:#0600ff;">in</span> _includes.<span style="color:#0000ff;">Values</span>.<span style="color:#0000ff;">OfType</span><span style="color:#008000;">&lt;</span>PropertyInfo<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>prop.<span style="color:#0000ff;">DeclaringType</span> <span style="color:#008000;">==</span> type<span style="color:#000000;">)</span>
                <span style="color:#000000;">{</span>
                    preloadedMembers.<span style="color:#0000ff;">Add</span><span style="color:#000000;">(</span>prop<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
                <span style="color:#000000;">}</span>
            <span style="color:#000000;">}</span>
            <span style="color:#0600ff;">return</span> preloadedMembers.<span style="color:#0000ff;">ToArray</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">internal</span> <span style="color:#ff0000;">bool</span> IsPreloaded<span style="color:#000000;">(</span>MemberInfo member<span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">return</span> _includes.<span style="color:#0000ff;">ContainsKey</span><span style="color:#000000;">(</span><span style="color:#008000;">new</span> MetaPosition<span style="color:#000000;">(</span>member<span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">public</span> <span style="color:#0600ff;">void</span> LoadWith<span style="color:#008000;">&lt;</span>T<span style="color:#008000;">&gt;</span><span style="color:#000000;">(</span>Expression<span style="color:#008000;">&lt;</span>Func<span style="color:#008000;">&lt;</span>T, <span style="color:#ff0000;">object</span><span style="color:#008000;">&gt;&gt;</span> expression<span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>

            MemberInfo loadWithMemberInfo <span style="color:#008000;">=</span> GetLoadWithMemberInfo<span style="color:#000000;">(</span>expression<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>IsPreloaded<span style="color:#000000;">(</span>loadWithMemberInfo<span style="color:#000000;">)</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> InvalidOperationException<span style="color:#000000;">(</span><span style="color:#666666;">"Association is already added"</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
            Preload<span style="color:#000000;">(</span>loadWithMemberInfo<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">private</span> <span style="color:#0600ff;">void</span> Preload<span style="color:#000000;">(</span>MemberInfo association<span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>

            _includes.<span style="color:#0000ff;">Add</span><span style="color:#000000;">(</span><span style="color:#008000;">new</span> MetaPosition<span style="color:#000000;">(</span>association<span style="color:#000000;">)</span>, association<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">private</span> <span style="color:#0600ff;">static</span> MemberInfo GetLoadWithMemberInfo<span style="color:#000000;">(</span>LambdaExpression lambda<span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            var body <span style="color:#008000;">=</span> lambda.<span style="color:#0000ff;">Body</span><span style="color:#008000;">;</span>
            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span><span style="color:#000000;">(</span>body <span style="color:#008000;">!=</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span> <span style="color:#008000;">&amp;&amp;</span> <span style="color:#000000;">(</span><span style="color:#000000;">(</span>body.<span style="color:#0000ff;">NodeType</span> <span style="color:#008000;">==</span> ExpressionType.<span style="color:#0000ff;">Convert</span><span style="color:#000000;">)</span> <span style="color:#008000;">||</span> <span style="color:#000000;">(</span>body.<span style="color:#0000ff;">NodeType</span> <span style="color:#008000;">==</span> ExpressionType.<span style="color:#0000ff;">ConvertChecked</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                body <span style="color:#008000;">=</span> <span style="color:#000000;">(</span><span style="color:#000000;">(</span>UnaryExpression<span style="color:#000000;">)</span>body<span style="color:#000000;">)</span>.<span style="color:#0000ff;">Operand</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
            var expression <span style="color:#008000;">=</span> body <span style="color:#0600ff;">as</span> MemberExpression<span style="color:#008000;">;</span>

            ValidateMemberExpression<span style="color:#000000;">(</span>expression<span style="color:#000000;">)</span><span style="color:#008000;">;</span>

            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>expression <span style="color:#008000;">!=</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span> <span style="color:#0600ff;">return</span> expression.<span style="color:#0000ff;">Member</span><span style="color:#008000;">;</span>

            <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> InvalidOperationException<span style="color:#000000;">(</span><span style="color:#666666;">"The expression specified must be of the form p.A, where p is the parameter and A is a property member."</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
        <span style="color:#000000;">}</span>
        <span style="color:#0600ff;">private</span> <span style="color:#0600ff;">static</span> <span style="color:#0600ff;">void</span> ValidateMemberExpression<span style="color:#000000;">(</span>MemberExpression expression<span style="color:#000000;">)</span>
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span><span style="color:#000000;">(</span>expression <span style="color:#008000;">==</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span> <span style="color:#008000;">||</span> <span style="color:#000000;">(</span>expression.<span style="color:#0000ff;">Expression</span>.<span style="color:#0000ff;">NodeType</span> <span style="color:#008000;">!=</span> ExpressionType.<span style="color:#0000ff;">Parameter</span><span style="color:#000000;">)</span> <span style="color:#008000;">||</span> expression.<span style="color:#0000ff;">Member</span>.<span style="color:#0000ff;">MemberType</span> <span style="color:#008000;">!=</span> MemberTypes.<span style="color:#0000ff;">Property</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> InvalidOperationException<span style="color:#000000;">(</span><span style="color:#666666;">"The expression specified must be of the form p.A, where p is the parameter and A is a property member."</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
            var member <span style="color:#008000;">=</span> expression.<span style="color:#0000ff;">Member</span> <span style="color:#0600ff;">as</span> PropertyInfo<span style="color:#008000;">;</span>
            <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>member <span style="color:#008000;">!=</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#008080;font-style:italic;">//Member type must be EntityCollection&lt;T&gt; or StructuralObject</span>
                var isEntityCollection <span style="color:#008000;">=</span> ValidTypes.<span style="color:#0000ff;">Any</span><span style="color:#000000;">(</span>s <span style="color:#008000;">=&gt;</span> s <span style="color:#008000;">==</span> member.<span style="color:#0000ff;">PropertyType</span>.<span style="color:#0000ff;">Name</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
                var isEntity <span style="color:#008000;">=</span> member.<span style="color:#0000ff;">PropertyType</span>.<span style="color:#0000ff;">BaseType</span> <span style="color:#008000;">!=</span> <span style="color:#0600ff;">null</span> <span style="color:#008000;">&amp;&amp;</span>
                               ValidTypes.<span style="color:#0000ff;">Any</span><span style="color:#000000;">(</span>s <span style="color:#008000;">=&gt;</span> s <span style="color:#008000;">==</span> member.<span style="color:#0000ff;">PropertyType</span>.<span style="color:#0000ff;">BaseType</span>.<span style="color:#0000ff;">Name</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>

                <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span><span style="color:#008000;">!</span>isEntity <span style="color:#008000;">&amp;&amp;</span> <span style="color:#008000;">!</span>isEntityCollection<span style="color:#000000;">)</span>
                <span style="color:#000000;">{</span>
                    var errorMsg <span style="color:#008000;">=</span>
                    <span style="color:#ff0000;">String</span>.<span style="color:#0000ff;">Format</span><span style="color:#000000;">(</span>
                        <span style="color:#666666;">"Related end <span style="color:#008080;font-weight:bold;">\"</span>{0}<span style="color:#008080;font-weight:bold;">\"</span> must be of type that implements System.Data.Objects.DataClasses.EntityCollection&lt;T&gt; or System.Data.Objects.DataClasses.IEntityWithRelationships"</span>,
                        expression<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
                    <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> InvalidOperationException<span style="color:#000000;">(</span>errorMsg<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
                <span style="color:#000000;">}</span>
            <span style="color:#000000;">}</span>
            <span style="color:#0600ff;">else</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">throw</span> <span style="color:#008000;">new</span> InvalidOperationException<span style="color:#000000;">(</span><span style="color:#ff0000;">String</span>.<span style="color:#0000ff;">Format</span><span style="color:#000000;">(</span><span style="color:#666666;">"{0} must be property member"</span>, expression<span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
        <span style="color:#000000;">}</span>

        <span style="color:#0600ff;">private</span> <span style="color:#ff0000;">struct</span> MetaPosition <span style="color:#008000;">:</span> IEqualityComparer<span style="color:#008000;">&lt;</span>MetaPosition<span style="color:#008000;">&gt;</span>, IEqualityComparer
        <span style="color:#000000;">{</span>
            <span style="color:#0600ff;">private</span> <span style="color:#0600ff;">readonly</span> <span style="color:#ff0000;">int</span> _metadataToken<span style="color:#008000;">;</span>

            <span style="color:#0600ff;">private</span> <span style="color:#0600ff;">readonly</span> Assembly _assembly<span style="color:#008000;">;</span>

            <span style="color:#0600ff;">internal</span> MetaPosition<span style="color:#000000;">(</span>MemberInfo mi<span style="color:#000000;">)</span>
                <span style="color:#008000;">:</span> <span style="color:#0600ff;">this</span><span style="color:#000000;">(</span>mi.<span style="color:#0000ff;">DeclaringType</span>.<span style="color:#0000ff;">Assembly</span>, mi.<span style="color:#0000ff;">MetadataToken</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
            <span style="color:#000000;">}</span>
            <span style="color:#0600ff;">private</span> MetaPosition<span style="color:#000000;">(</span>Assembly assembly, <span style="color:#ff0000;">int</span> metadataToken<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                _assembly <span style="color:#008000;">=</span> assembly<span style="color:#008000;">;</span>
                _metadataToken <span style="color:#008000;">=</span> metadataToken<span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>

            <span style="color:#0600ff;">public</span> <span style="color:#0600ff;">override</span> <span style="color:#ff0000;">bool</span> Equals<span style="color:#000000;">(</span><span style="color:#ff0000;">object</span> obj<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>obj <span style="color:#008000;">==</span> <span style="color:#0600ff;">null</span><span style="color:#000000;">)</span>
                <span style="color:#000000;">{</span>
                    <span style="color:#0600ff;">return</span> false<span style="color:#008000;">;</span>
                <span style="color:#000000;">}</span>
                <span style="color:#0600ff;">if</span> <span style="color:#000000;">(</span>obj.<span style="color:#0000ff;">GetType</span><span style="color:#000000;">(</span><span style="color:#000000;">)</span> <span style="color:#008000;">!=</span> GetType<span style="color:#000000;">(</span><span style="color:#000000;">)</span><span style="color:#000000;">)</span>
                <span style="color:#000000;">{</span>
                    <span style="color:#0600ff;">return</span> false<span style="color:#008000;">;</span>
                <span style="color:#000000;">}</span>
                <span style="color:#0600ff;">return</span> AreEqual<span style="color:#000000;">(</span><span style="color:#0600ff;">this</span>, <span style="color:#000000;">(</span>MetaPosition<span style="color:#000000;">)</span>obj<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
            <span style="color:#0600ff;">public</span> <span style="color:#ff0000;">bool</span> Equals<span style="color:#000000;">(</span>MetaPosition x, MetaPosition y<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">return</span> AreEqual<span style="color:#000000;">(</span>x, y<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
            <span style="color:#0600ff;">public</span> <span style="color:#0600ff;">override</span> <span style="color:#ff0000;">int</span> GetHashCode<span style="color:#000000;">(</span><span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">return</span> _metadataToken<span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
            <span style="color:#0600ff;">public</span> <span style="color:#ff0000;">int</span> GetHashCode<span style="color:#000000;">(</span>MetaPosition obj<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">return</span> obj._metadataToken<span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>

            <span style="color:#0600ff;">public</span> <span style="color:#0600ff;">static</span> <span style="color:#ff0000;">bool</span> <span style="color:#0600ff;">operator</span> <span style="color:#008000;">==</span><span style="color:#000000;">(</span>MetaPosition x, MetaPosition y<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">return</span> AreEqual<span style="color:#000000;">(</span>x, y<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
            <span style="color:#0600ff;">public</span> <span style="color:#0600ff;">static</span> <span style="color:#ff0000;">bool</span> <span style="color:#0600ff;">operator</span> <span style="color:#008000;">!=</span><span style="color:#000000;">(</span>MetaPosition x, MetaPosition y<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">return</span> <span style="color:#008000;">!</span>AreEqual<span style="color:#000000;">(</span>x, y<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>

            <span style="color:#ff0000;">bool</span> IEqualityComparer.<span style="color:#0000ff;">Equals</span><span style="color:#000000;">(</span><span style="color:#ff0000;">object</span> x, <span style="color:#ff0000;">object</span> y<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">return</span> Equals<span style="color:#000000;">(</span><span style="color:#000000;">(</span>MetaPosition<span style="color:#000000;">)</span>x, <span style="color:#000000;">(</span>MetaPosition<span style="color:#000000;">)</span>y<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>
            <span style="color:#ff0000;">int</span> IEqualityComparer.<span style="color:#0000ff;">GetHashCode</span><span style="color:#000000;">(</span><span style="color:#ff0000;">object</span> obj<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">return</span> GetHashCode<span style="color:#000000;">(</span><span style="color:#000000;">(</span>MetaPosition<span style="color:#000000;">)</span>obj<span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>

            <span style="color:#0600ff;">private</span> <span style="color:#0600ff;">static</span> <span style="color:#ff0000;">bool</span> AreEqual<span style="color:#000000;">(</span>MetaPosition x, MetaPosition y<span style="color:#000000;">)</span>
            <span style="color:#000000;">{</span>
                <span style="color:#0600ff;">return</span> <span style="color:#000000;">(</span><span style="color:#000000;">(</span>x._metadataToken <span style="color:#008000;">==</span> y._metadataToken<span style="color:#000000;">)</span> <span style="color:#008000;">&amp;&amp;</span> <span style="color:#000000;">(</span>x._assembly <span style="color:#008000;">==</span> y._assembly<span style="color:#000000;">)</span><span style="color:#000000;">)</span><span style="color:#008000;">;</span>
            <span style="color:#000000;">}</span>

        <span style="color:#000000;">}</span>
    <span style="color:#000000;">}</span>
<span style="color:#000000;">}</span></pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pavelfedulov.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pavelfedulov.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pavelfedulov.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pavelfedulov.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pavelfedulov.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pavelfedulov.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pavelfedulov.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pavelfedulov.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pavelfedulov.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pavelfedulov.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pavelfedulov.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pavelfedulov.wordpress.com/7/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pavelfedulov.wordpress.com/7/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pavelfedulov.wordpress.com/7/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pavelfedulov.wordpress.com&amp;blog=12392924&amp;post=7&amp;subd=pavelfedulov&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pavelfedulov.wordpress.com/2010/06/15/entity-framework-context-wrapper/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/63339c552dd6b439d54a6c7c6e366602?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Pavel</media:title>
		</media:content>
	</item>
	</channel>
</rss>
