<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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:georss="http://www.georss.org/georss" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Static Void</title>
    <link>http://martinwilley.com/blog/</link>
    <description>What next?</description>
    <language>en-us</language>
    <copyright>Martin Willey</copyright>
    <lastBuildDate>Wed, 21 Mar 2012 06:18:25 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>me@martinwilley.com</managingEditor>
    <webMaster>me@martinwilley.com</webMaster>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=884b5782-0923-43bd-b3b5-eb359c657758</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,884b5782-0923-43bd-b3b5-eb359c657758.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,884b5782-0923-43bd-b3b5-eb359c657758.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=884b5782-0923-43bd-b3b5-eb359c657758</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">EF Code First has a neat method to merge
in the values of a DTO into an mapped entity.<br /><br />
context.Entry(entity).CurrentValues.SetValues(dataTransferObject);<br /><br />
The DTO will generally have a primary key property, and you can use that to determine
if it is a new record or a modification. Here's a method that does that:<br /><span style="color: blue;">public</span><span style="color: blue;">static</span> T
Merge&lt;T&gt;(<span style="color: blue;">this</span><span style="color: #2b91af;">DbContext</span> context, <span style="color: blue;">object</span> dataTransferObject)<br />
             <span style="color: blue;">where</span> T
: <span style="color: blue;">class</span><br />
        {<br />
            <span style="color: blue;">if</span> (context
== <span style="color: blue;">null</span>) <span style="color: blue;">throw</span><span style="color: blue;">new</span><span style="color: #2b91af;">ArgumentNullException</span>(<span style="color: #a31515;">"context"</span>);<br />
            <span style="color: blue;">if</span> (dataTransferObject
== <span style="color: blue;">null</span>) <span style="color: blue;">throw</span><span style="color: blue;">new</span><span style="color: #2b91af;">ArgumentNullException</span>(<span style="color: #a31515;">"dataTransferObject"</span>);<br />
 <br />
            <span style="color: blue;">var</span> property
= FindPrimaryKeyProperty&lt;T&gt;(context);<br />
            <span style="color: green;">//find
the id property of the dto</span><br />
            <span style="color: blue;">var</span> idProperty
= dataTransferObject.GetType().GetProperty(property.Name);<br />
            <span style="color: blue;">if</span> (idProperty
== <span style="color: blue;">null</span>)<br />
                <span style="color: blue;">throw</span><span style="color: blue;">new</span><span style="color: #2b91af;">InvalidOperationException</span>(<span style="color: #a31515;">"Cannot
find an id on the dataTransferObject"</span>);<br />
            <span style="color: blue;">var</span> id
= idProperty.GetValue(dataTransferObject, <span style="color: blue;">null</span>);<br />
            <span style="color: green;">//has
the id been set (existing item) or not (transient)?</span><br />
            <span style="color: blue;">var</span> propertyType
= property.PropertyType;<br />
            <span style="color: blue;">var</span> transientValue
= propertyType.IsValueType ?<br />
                <span style="color: #2b91af;">Activator</span>.CreateInstance(propertyType)
: <span style="color: blue;">null</span>;<br />
            <span style="color: blue;">var</span> isTransient
= Equals(id, transientValue);<br />
            T entity;<br />
            <span style="color: blue;">if</span> (isTransient)<br />
            {<br />
                <span style="color: green;">//it's
transient, just create a dummy</span><br />
                entity
= CreateEntity&lt;T&gt;(id, property);<br />
                <span style="color: green;">//if
DatabaseGeneratedOption(DatabaseGeneratedOption.None) and no id, this errors</span><br />
                context.Set&lt;T&gt;().Attach(entity);<br />
            }<br />
            <span style="color: blue;">else</span><br />
            {<br />
                <span style="color: green;">//try
to load from identity map or database</span><br />
                entity
= context.Set&lt;T&gt;().Find(id);<br />
                <span style="color: blue;">if</span> (entity
== <span style="color: blue;">null</span>)<br />
                {<br />
                    <span style="color: green;">//could
not find entity, assume assigned primary key</span><br />
                   
entity = CreateEntity&lt;T&gt;(id, property);<br />
                   
context.Set&lt;T&gt;().Add(entity);<br />
                }<br />
            }<br />
            <span style="color: green;">//copy
the values from DTO onto the entry</span><br />
            context.Entry(entity).CurrentValues.SetValues(dataTransferObject);<br />
            <span style="color: blue;">return</span> entity;<br />
        }<br />
 <br />
 <br />
        <span style="color: blue;">private</span><span style="color: blue;">static</span><span style="color: #2b91af;">PropertyInfo</span> FindPrimaryKeyProperty&lt;T&gt;(<span style="color: #2b91af;">IObjectContextAdapter</span> context)<br />
            <span style="color: blue;">where</span> T
: <span style="color: blue;">class</span><br />
        {<br />
            <span style="color: green;">//find
the primary key</span><br />
            <span style="color: blue;">var</span> objectContext
= context.ObjectContext;<br />
            <span style="color: green;">//this
will error if it's not a mapped entity</span><br />
            <span style="color: blue;">var</span> objectSet
= objectContext.CreateObjectSet&lt;T&gt;();<br />
            <span style="color: blue;">var</span> elementType
= objectSet.EntitySet.ElementType;<br />
            <span style="color: blue;">var</span> pk
= elementType.KeyMembers.First();<br />
            <span style="color: green;">//look
it up on the entity</span><br />
            <span style="color: blue;">var</span> propertyInfo
= <span style="color: blue;">typeof</span>(T).GetProperty(pk.Name);<br />
            <span style="color: blue;">return</span> propertyInfo;<br />
        }<br />
 <br />
        <span style="color: blue;">private</span><span style="color: blue;">static</span> T
CreateEntity&lt;T&gt;(<span style="color: blue;">object</span> id, <span style="color: #2b91af;">PropertyInfo</span> property)<br />
            <span style="color: blue;">where</span> T
: <span style="color: blue;">class</span><br />
        {<br />
            <span style="color: green;">//
consider IoC here</span><br />
            <span style="color: blue;">var</span> entity
= (T)<span style="color: #2b91af;">Activator</span>.CreateInstance(<span style="color: blue;">typeof</span>(T));<br />
            <span style="color: green;">//set
the value of the primary key (may error if wrong type)</span><br />
            property.SetValue(entity,
id, <span style="color: blue;">null</span>);<br />
            <span style="color: blue;">return</span> entity;<br />
        }<br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=884b5782-0923-43bd-b3b5-eb359c657758" /></body>
      <title>EF Code First - Add a DTO</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,884b5782-0923-43bd-b3b5-eb359c657758.aspx</guid>
      <link>http://martinwilley.com/blog/2012/03/21/EFCodeFirstAddADTO.aspx</link>
      <pubDate>Wed, 21 Mar 2012 06:18:25 GMT</pubDate>
      <description>EF Code First has a neat method to merge in the values of a DTO into an mapped entity.&lt;br&gt;
&lt;br&gt;
context.Entry(entity).CurrentValues.SetValues(dataTransferObject);&lt;br&gt;
&lt;br&gt;
The DTO will generally have a primary key property, and you can use that to determine
if it is a new record or a modification. Here's a method that does that:&lt;br&gt;
&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; T
Merge&amp;lt;T&amp;gt;(&lt;span style="color: blue;"&gt;this&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DbContext&lt;/span&gt; context, &lt;span style="color: blue;"&gt;object&lt;/span&gt; dataTransferObject)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;where&lt;/span&gt; T
: &lt;span style="color: blue;"&gt;class&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (context
== &lt;span style="color: blue;"&gt;null&lt;/span&gt;) &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"context"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (dataTransferObject
== &lt;span style="color: blue;"&gt;null&lt;/span&gt;) &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"dataTransferObject"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; property
= FindPrimaryKeyProperty&amp;lt;T&amp;gt;(context);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//find
the id property of the dto&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; idProperty
= dataTransferObject.GetType().GetProperty(property.Name);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (idProperty
== &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color: #a31515;"&gt;"Cannot
find an id on the dataTransferObject"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; id
= idProperty.GetValue(dataTransferObject, &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//has
the id been set (existing item) or not (transient)?&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; propertyType
= property.PropertyType;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; transientValue
= propertyType.IsValueType ?&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af;"&gt;Activator&lt;/span&gt;.CreateInstance(propertyType)
: &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; isTransient
= Equals(id, transientValue);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; T entity;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (isTransient)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//it's
transient, just create a dummy&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; entity
= CreateEntity&amp;lt;T&amp;gt;(id, property);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//if
DatabaseGeneratedOption(DatabaseGeneratedOption.None) and no id, this errors&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; context.Set&amp;lt;T&amp;gt;().Attach(entity);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//try
to load from identity map or database&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; entity
= context.Set&amp;lt;T&amp;gt;().Find(id);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt; (entity
== &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//could
not find entity, assume assigned primary key&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
entity = CreateEntity&amp;lt;T&amp;gt;(id, property);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;
context.Set&amp;lt;T&amp;gt;().Add(entity);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//copy
the values from DTO onto the entry&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; context.Entry(entity).CurrentValues.SetValues(dataTransferObject);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; entity;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;PropertyInfo&lt;/span&gt; FindPrimaryKeyProperty&amp;lt;T&amp;gt;(&lt;span style="color: #2b91af;"&gt;IObjectContextAdapter&lt;/span&gt; context)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;where&lt;/span&gt; T
: &lt;span style="color: blue;"&gt;class&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//find
the primary key&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; objectContext
= context.ObjectContext;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//this
will error if it's not a mapped entity&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; objectSet
= objectContext.CreateObjectSet&amp;lt;T&amp;gt;();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; elementType
= objectSet.EntitySet.ElementType;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; pk
= elementType.KeyMembers.First();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//look
it up on the entity&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; propertyInfo
= &lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(T).GetProperty(pk.Name);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; propertyInfo;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;private&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; T
CreateEntity&amp;lt;T&amp;gt;(&lt;span style="color: blue;"&gt;object&lt;/span&gt; id, &lt;span style="color: #2b91af;"&gt;PropertyInfo&lt;/span&gt; property)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;where&lt;/span&gt; T
: &lt;span style="color: blue;"&gt;class&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//
consider IoC here&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;var&lt;/span&gt; entity
= (T)&lt;span style="color: #2b91af;"&gt;Activator&lt;/span&gt;.CreateInstance(&lt;span style="color: blue;"&gt;typeof&lt;/span&gt;(T));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green;"&gt;//set
the value of the primary key (may error if wrong type)&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; property.SetValue(entity,
id, &lt;span style="color: blue;"&gt;null&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; entity;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=884b5782-0923-43bd-b3b5-eb359c657758" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,884b5782-0923-43bd-b3b5-eb359c657758.aspx</comments>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=5d9159b9-ec54-4c84-bba8-e2f1c0da0c31</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,5d9159b9-ec54-4c84-bba8-e2f1c0da0c31.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,5d9159b9-ec54-4c84-bba8-e2f1c0da0c31.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=5d9159b9-ec54-4c84-bba8-e2f1c0da0c31</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">When the Code First project get a detached
entity from the UI, it may need to check if it is a new (transient) entity - which
can be added to the DbSet - or an existing entity that has been modified. You can
then implement an AddOrUpdate method.<br /><br />
To do that, it needs to know what the primary key of the entity is, and read the value.<br /><br />
The easiest way to do is generically is for all entities to have a standard interface
or abstract base. 
<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">var</span> id = ((<span style="color:#2b91af;">IEntity</span>) entity).Id; <span style="color:blue;">if</span> (id == <span style="color:blue;">default</span>(<span style="color:blue;">int</span>))
{     <span style="color:green;">//add</span> } <span style="color:blue;">else</span> {
    <span style="color:green;">//update</span> }</pre>If you use
the [Key] attribute you can also use that to discover the primary key of the entity,
whatever the type.<br /><br />
Finally,  you can use EF's internal metadata. 
<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">public</span> <span style="color:blue;">static</span> <span style="color:blue;">bool</span> IsTransient&lt;T&gt;(<span style="color:#2b91af;">DbContext</span> context, T entity)
    <span style="color:blue;">where</span> T : <span style="color:blue;">class</span> {
    <span style="color:green;">//find the primary key</span>     <span style="color:blue;">var</span> objectContext = ((<span style="color:#2b91af;">IObjectContextAdapter</span>)context).ObjectContext;
    <span style="color:green;">//this will error if it's not a mapped entity</span>     <span style="color:blue;">var</span> objectSet = objectContext.CreateObjectSet&lt;T&gt;();
    <span style="color:blue;">var</span> elementType = objectSet.EntitySet.ElementType;
    <span style="color:blue;">var</span> pk = elementType.KeyMembers.First();
    <span style="color:green;">//look it up on the entity</span>     <span style="color:blue;">var</span> propertyInfo = <span style="color:blue;">typeof</span>(T).GetProperty(pk.Name);
    <span style="color:blue;">var</span> propertyType = propertyInfo.PropertyType;
    <span style="color:green;">//what's the default value for the type?</span>     <span style="color:blue;">var</span> transientValue = propertyType.IsValueType ? <span style="color:#2b91af;">Activator</span>.CreateInstance(propertyType) : <span style="color:blue;">null</span>;
    <span style="color:green;">//is the pk the same as the default value (int == 0, string == null ...)</span>     <span style="color:blue;">return</span> propertyInfo.GetValue(entity, <span style="color:blue;">null</span>) == transientValue;
}</pre><br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=5d9159b9-ec54-4c84-bba8-e2f1c0da0c31" /></body>
      <title>EF Code First - is entity transient?</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,5d9159b9-ec54-4c84-bba8-e2f1c0da0c31.aspx</guid>
      <link>http://martinwilley.com/blog/2012/03/20/EFCodeFirstIsEntityTransient.aspx</link>
      <pubDate>Tue, 20 Mar 2012 04:29:09 GMT</pubDate>
      <description>When the Code First project get a detached entity from the UI, it may need to check if it is a new (transient) entity - which can be added to the DbSet - or an existing entity that has been modified. You can then implement an AddOrUpdate method.&lt;br&gt;
&lt;br&gt;
To do that, it needs to know what the primary key of the entity is, and read the value.&lt;br&gt;
&lt;br&gt;
The easiest way to do is generically is for all entities to have a standard interface
or abstract base. 
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;id&amp;nbsp;=&amp;nbsp;((&lt;span style="color:#2b91af;"&gt;IEntity&lt;/span&gt;)&amp;nbsp;entity).Id; &lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(id&amp;nbsp;==&amp;nbsp;&lt;span style="color:blue;"&gt;default&lt;/span&gt;(&lt;span style="color:blue;"&gt;int&lt;/span&gt;))
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//add&lt;/span&gt; } &lt;span style="color:blue;"&gt;else&lt;/span&gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//update&lt;/span&gt; }&lt;/pre&gt;If you use
the [Key] attribute you can also use that to discover the primary key of the entity,
whatever the type.&lt;br&gt;
&lt;br&gt;
Finally,&amp;nbsp; you can use EF's internal metadata. 
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;nbsp;IsTransient&amp;lt;T&amp;gt;(&lt;span style="color:#2b91af;"&gt;DbContext&lt;/span&gt;&amp;nbsp;context,&amp;nbsp;T&amp;nbsp;entity)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;where&lt;/span&gt;&amp;nbsp;T&amp;nbsp;:&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//find&amp;nbsp;the&amp;nbsp;primary&amp;nbsp;key&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;objectContext&amp;nbsp;=&amp;nbsp;((&lt;span style="color:#2b91af;"&gt;IObjectContextAdapter&lt;/span&gt;)context).ObjectContext;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//this&amp;nbsp;will&amp;nbsp;error&amp;nbsp;if&amp;nbsp;it's&amp;nbsp;not&amp;nbsp;a&amp;nbsp;mapped&amp;nbsp;entity&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;objectSet&amp;nbsp;=&amp;nbsp;objectContext.CreateObjectSet&amp;lt;T&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;elementType&amp;nbsp;=&amp;nbsp;objectSet.EntitySet.ElementType;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;pk&amp;nbsp;=&amp;nbsp;elementType.KeyMembers.First();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//look&amp;nbsp;it&amp;nbsp;up&amp;nbsp;on&amp;nbsp;the&amp;nbsp;entity&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;propertyInfo&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T).GetProperty(pk.Name);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;propertyType&amp;nbsp;=&amp;nbsp;propertyInfo.PropertyType;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//what's&amp;nbsp;the&amp;nbsp;default&amp;nbsp;value&amp;nbsp;for&amp;nbsp;the&amp;nbsp;type?&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;transientValue&amp;nbsp;=&amp;nbsp;propertyType.IsValueType&amp;nbsp;?&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Activator&lt;/span&gt;.CreateInstance(propertyType)&amp;nbsp;:&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//is&amp;nbsp;the&amp;nbsp;pk&amp;nbsp;the&amp;nbsp;same&amp;nbsp;as&amp;nbsp;the&amp;nbsp;default&amp;nbsp;value&amp;nbsp;(int&amp;nbsp;==&amp;nbsp;0,&amp;nbsp;string&amp;nbsp;==&amp;nbsp;null&amp;nbsp;...)&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;propertyInfo.GetValue(entity,&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;)&amp;nbsp;==&amp;nbsp;transientValue;
}&lt;/pre&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=5d9159b9-ec54-4c84-bba8-e2f1c0da0c31" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,5d9159b9-ec54-4c84-bba8-e2f1c0da0c31.aspx</comments>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=e2923ad4-daa5-4022-9b65-a41f4898e79f</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,e2923ad4-daa5-4022-9b65-a41f4898e79f.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,e2923ad4-daa5-4022-9b65-a41f4898e79f.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=e2923ad4-daa5-4022-9b65-a41f4898e79f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="http://martinwilley.com/blog/2012/03/18/EFCodeFirstUsingDummyReferences.aspx">Last
time</a> I was adding a new record with a reference to a dummy record. I marked the
reference as Unchanged so Code First wouldn't try to validate or save it.<br /><p><span style="font-family:Consolas;color:#000000;">var johnCarter = new </span><span style="font-family:Consolas;color:#2b91af;">Movie</span><span style="font-family:Consolas;color:#000000;">()
{ Title = </span><span style="font-family:Consolas;color:#a31515;">"John Carter"</span><span style="font-family:Consolas;color:#000000;"> };<br />
johnCarter.DirectorId = andrewStantonId;<br />
context.Movies.Add(johnCarter);<br />
//after it's added, change the status of the reference<br />
context.Entry(johnCarter.Director).State = </span><span style="font-family:Consolas;color:#2b91af;">EntityState</span><span style="font-family:Consolas;color:#000000;">.Unchanged;<br />
context.SaveChanges();</span></p>
Can you set all the references on any entity? 
<br /><p style="font-family:Consolas;color:#000000;">
var johnCarter = new <span style="font-family:Consolas;color:#2b91af;">Movie</span><span style="font-family:Consolas;color:#000000;">()
{ Title = </span><span style="font-family:Consolas;color:#a31515;">"John Carter"</span> };<br />
johnCarter.DirectorId = andrewStantonId;<br />
context.Movies.Add(johnCarter);<br />
//after it's added, change the status of the reference<br /><span style="background-color:#ff0">MarkNavigationPropertiesUnchanged(johnCarter)</span><span style="font-family:Consolas;color:#000000;">;<br />
context.SaveChanges();</span></p>
We have to look into the underlying EF model.<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">private</span> <span style="color:blue;">static</span> <span style="color:blue;">void</span> MarkNavigationPropertiesUnchanged&lt;T&gt;(<span style="color:#2b91af;">DbContext</span> context, T entity)
    <span style="color:blue;">where</span> T : <span style="color:blue;">class</span> {
    <span style="color:blue;">var</span> objectContext = ((<span style="color:#2b91af;">IObjectContextAdapter</span>)context).ObjectContext;
    <span style="color:blue;">var</span> objectSet = objectContext.CreateObjectSet&lt;T&gt;();
    <span style="color:blue;">var</span> elementType = objectSet.EntitySet.ElementType;
    <span style="color:blue;">var</span> navigationProperties = elementType.NavigationProperties;
    <span style="color:green;">//the references</span>     <span style="color:blue;">var</span> references = <span style="color:blue;">from</span> navigationProperty <span style="color:blue;">in</span> navigationProperties
                        <span style="color:blue;">let</span> end = navigationProperty.ToEndMember
                        <span style="color:blue;">where</span> end.RelationshipMultiplicity == <span style="color:#2b91af;">RelationshipMultiplicity</span>.ZeroOrOne ||
                        end.RelationshipMultiplicity == <span style="color:#2b91af;">RelationshipMultiplicity</span>.One
                        <span style="color:blue;">select</span> navigationProperty.Name;
    <span style="color:green;">//NB: We don't check Collections. EF wants to handle the object graph.</span>     <span style="color:blue;">var</span> parentEntityState = context.Entry(entity).State;
    <span style="color:blue;">foreach</span> (<span style="color:blue;">var</span> navigationProperty <span style="color:blue;">in</span> references)
    {         <span style="color:green;">//if it's modified but not loaded, don't need to touch it</span>         <span style="color:blue;">if</span> (parentEntityState == <span style="color:#2b91af;">EntityState</span>.Modified &amp;&amp;
            !context.Entry(entity).Reference(navigationProperty).IsLoaded)
            <span style="color:blue;">continue</span>;
        <span style="color:blue;">var</span> propertyInfo = <span style="color:blue;">typeof</span>(T).GetProperty(navigationProperty);
        <span style="color:blue;">var</span> value = propertyInfo.GetValue(entity, <span style="color:blue;">null</span>);
        context.Entry(value).State = <span style="color:#2b91af;">EntityState</span>.Unchanged;
    } }</pre><br />
This code only fixes the references to single entities (like movie.Director) - not
collections (like director.Movies). It's possible to discover and iterate the collections
to change their status, but you'll likely get exceptions from EF because its model
is broken.<br /><br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=e2923ad4-daa5-4022-9b65-a41f4898e79f" /></body>
      <title>EF Code First -  Generically setting entity references to unchanged status</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,e2923ad4-daa5-4022-9b65-a41f4898e79f.aspx</guid>
      <link>http://martinwilley.com/blog/2012/03/19/EFCodeFirstGenericallySettingEntityReferencesToUnchangedStatus.aspx</link>
      <pubDate>Mon, 19 Mar 2012 17:08:43 GMT</pubDate>
      <description>&lt;a href="http://martinwilley.com/blog/2012/03/18/EFCodeFirstUsingDummyReferences.aspx"&gt;Last
time&lt;/a&gt; I was adding a new record with a reference to a dummy record. I marked the
reference as Unchanged so Code First wouldn't try to validate or save it.&lt;br&gt;
&lt;p&gt;
&lt;span style="font-family:Consolas;color:#000000;"&gt;var johnCarter = new &lt;/span&gt;&lt;span style="font-family:Consolas;color:#2b91af;"&gt;Movie&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt;()
{ Title = &lt;/span&gt;&lt;span style="font-family:Consolas;color:#a31515;"&gt;"John Carter"&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt; };&lt;br&gt;
johnCarter.DirectorId = andrewStantonId;&lt;br&gt;
context.Movies.Add(johnCarter);&lt;br&gt;
//after it's added, change the status of the reference&lt;br&gt;
context.Entry(johnCarter.Director).State = &lt;/span&gt;&lt;span style="font-family:Consolas;color:#2b91af;"&gt;EntityState&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt;.Unchanged;&lt;br&gt;
context.SaveChanges();&lt;/span&gt;
&lt;/p&gt;
Can you set all the references on any entity? 
&lt;br&gt;
&lt;p style="font-family:Consolas;color:#000000;"&gt;
var johnCarter = new &lt;span style="font-family:Consolas;color:#2b91af;"&gt;Movie&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt;()
{ Title = &lt;/span&gt;&lt;span style="font-family:Consolas;color:#a31515;"&gt;"John Carter"&lt;/span&gt; };&lt;br&gt;
johnCarter.DirectorId = andrewStantonId;&lt;br&gt;
context.Movies.Add(johnCarter);&lt;br&gt;
//after it's added, change the status of the reference&lt;br&gt;
&lt;span style="background-color:#ff0"&gt;MarkNavigationPropertiesUnchanged(johnCarter)&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt;;&lt;br&gt;
context.SaveChanges();&lt;/span&gt;
&lt;/p&gt;
We have to look into the underlying EF model.&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&amp;nbsp;MarkNavigationPropertiesUnchanged&amp;lt;T&amp;gt;(&lt;span style="color:#2b91af;"&gt;DbContext&lt;/span&gt;&amp;nbsp;context,&amp;nbsp;T&amp;nbsp;entity)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;where&lt;/span&gt;&amp;nbsp;T&amp;nbsp;:&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;objectContext&amp;nbsp;=&amp;nbsp;((&lt;span style="color:#2b91af;"&gt;IObjectContextAdapter&lt;/span&gt;)context).ObjectContext;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;objectSet&amp;nbsp;=&amp;nbsp;objectContext.CreateObjectSet&amp;lt;T&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;elementType&amp;nbsp;=&amp;nbsp;objectSet.EntitySet.ElementType;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;navigationProperties&amp;nbsp;=&amp;nbsp;elementType.NavigationProperties;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//the&amp;nbsp;references&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;references&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;from&lt;/span&gt;&amp;nbsp;navigationProperty&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;navigationProperties
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;let&lt;/span&gt;&amp;nbsp;end&amp;nbsp;=&amp;nbsp;navigationProperty.ToEndMember
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;where&lt;/span&gt;&amp;nbsp;end.RelationshipMultiplicity&amp;nbsp;==&amp;nbsp;&lt;span style="color:#2b91af;"&gt;RelationshipMultiplicity&lt;/span&gt;.ZeroOrOne&amp;nbsp;||
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end.RelationshipMultiplicity&amp;nbsp;==&amp;nbsp;&lt;span style="color:#2b91af;"&gt;RelationshipMultiplicity&lt;/span&gt;.One
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;select&lt;/span&gt;&amp;nbsp;navigationProperty.Name;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//NB:&amp;nbsp;We&amp;nbsp;don't&amp;nbsp;check&amp;nbsp;Collections.&amp;nbsp;EF&amp;nbsp;wants&amp;nbsp;to&amp;nbsp;handle&amp;nbsp;the&amp;nbsp;object&amp;nbsp;graph.&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;parentEntityState&amp;nbsp;=&amp;nbsp;context.Entry(entity).State;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;navigationProperty&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;references)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//if&amp;nbsp;it's&amp;nbsp;modified&amp;nbsp;but&amp;nbsp;not&amp;nbsp;loaded,&amp;nbsp;don't&amp;nbsp;need&amp;nbsp;to&amp;nbsp;touch&amp;nbsp;it&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(parentEntityState&amp;nbsp;==&amp;nbsp;&lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Modified&amp;nbsp;&amp;amp;&amp;amp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!context.Entry(entity).Reference(navigationProperty).IsLoaded)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;continue&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;propertyInfo&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(T).GetProperty(navigationProperty);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;value&amp;nbsp;=&amp;nbsp;propertyInfo.GetValue(entity,&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Entry(value).State&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Unchanged;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} }&lt;/pre&gt;
&lt;br&gt;
This code only fixes the references to single entities (like movie.Director) - not
collections (like director.Movies). It's possible to discover and iterate the collections
to change their status, but you'll likely get exceptions from EF because its model
is broken.&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=e2923ad4-daa5-4022-9b65-a41f4898e79f" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,e2923ad4-daa5-4022-9b65-a41f4898e79f.aspx</comments>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=8549925c-fb0f-4dad-8ed4-29cf8db8132b</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,8549925c-fb0f-4dad-8ed4-29cf8db8132b.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,8549925c-fb0f-4dad-8ed4-29cf8db8132b.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=8549925c-fb0f-4dad-8ed4-29cf8db8132b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">You’re adding a new record, which has a
reference to an existing object.<br /><br /><span style="font-family:Consolas;color:#000000;">var johnCarter = new </span><span style="font-family:Consolas;color:#2b91af;">Movie</span><span style="font-family:Consolas;color:#000000;">()
{ Title = </span><span style="font-family:Consolas;color:#a31515;">"John Carter"</span><span style="font-family:Consolas;color:#000000;"> };<br />
johnCarter.Director = new </span><span style="font-family:Consolas;color:#2b91af;">Director</span><span style="font-family:Consolas;color:#000000;"> {
Id = andrewStantonId };<br />
context.Movies.Add(johnCarter);<br />
context.SaveChanges();</span><p>
SaveChanges() will save the new Movie- but it also saves a new Director record (which
gets a new Id, even though you set it manually). When you add an entity to a DbSet,
the entire object graph is marked as “Added”.
</p><p>
You could do a Find to load the Director record from the database, but it is a pointless
database access that you don’t need. It just needs to save the Movie record with a
known directorId. 
</p><p>
In NHibernate you can use session.Load&lt;Director&gt;(andrewStantonId) which will
create an empty proxy object without hitting the database. Only if you use one of
the proxy properties (like director.Name) will it hit the database to load the record.
EF Code First doesn’t have this feature.
</p><p>
One way round it to add a foreign key Id property to the Movie record:
</p><p><span style="font-family:Consolas;color:#000000;">        public
virtual </span><span style="font-family:Consolas;color:#2b91af;">Director</span><span style="font-family:Consolas;color:#000000;"> Director
{ get; set; }<br />
       public int? DirectorId { get; set; }</span></p><p>
You can then set the DirectorId directly. The two properties are not kept in step
automatically, so setting the DirectorId doesn’t cause Director to load from the database.
Foreign key Id properties are convenient, but your object model is “denormalized”.
</p><p>
The alternative is to mark the dummy record as unchanged. There are two ways.
</p><p>
One is to set the context.Entry state for the dummy reference AFTER the new record
has been added.
</p><p><span style="font-family:Consolas;color:#000000;">var johnCarter = new </span><span style="font-family:Consolas;color:#2b91af;">Movie</span><span style="font-family:Consolas;color:#000000;">()
{ Title = </span><span style="font-family:Consolas;color:#a31515;">"John Carter"</span><span style="font-family:Consolas;color:#000000;"> };<br />
johnCarter.DirectorId = andrewStantonId;<br />
context.Movies.Add(johnCarter);<br />
//after it's added, change the status of the reference<br />
context.Entry(johnCarter.Director).State = </span><span style="font-family:Consolas;color:#2b91af;">EntityState</span><span style="font-family:Consolas;color:#000000;">.Unchanged;<br />
context.SaveChanges();</span></p><p>
The second way is to create the dummy reference by Attaching it.
</p><p><span style="font-family:Consolas;color:#000000;">//attach the dummy director record<br />
var andrewStanton = new </span><span style="font-family:Consolas;color:#2b91af;">Director</span><span style="font-family:Consolas;color:#000000;"> {
Id = andrewStantonId};<br />
context.Directors.Attach(andrewStanton);<br />
//now we have an "unchanged" director record to attach<br />
var johnCarter = new </span><span style="font-family:Consolas;color:#2b91af;">Movie</span><span style="font-family:Consolas;color:#000000;">()
{ Title = </span><span style="font-family:Consolas;color:#a31515;">"John Carter"</span><span style="font-family:Consolas;color:#000000;"> };<br />
johnCarter.Director = andrewStanton;<br />
context.Movies.Add(johnCarter);<br />
context.SaveChanges();</span></p><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=8549925c-fb0f-4dad-8ed4-29cf8db8132b" /></body>
      <title>EF Code First - Using dummy references</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,8549925c-fb0f-4dad-8ed4-29cf8db8132b.aspx</guid>
      <link>http://martinwilley.com/blog/2012/03/18/EFCodeFirstUsingDummyReferences.aspx</link>
      <pubDate>Sun, 18 Mar 2012 07:04:08 GMT</pubDate>
      <description>You’re adding a new record, which has a reference to an existing object.&lt;br&gt;
&lt;br&gt;
&lt;span style="font-family:Consolas;color:#000000;"&gt;var johnCarter = new &lt;/span&gt;&lt;span style="font-family:Consolas;color:#2b91af;"&gt;Movie&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt;()
{ Title = &lt;/span&gt;&lt;span style="font-family:Consolas;color:#a31515;"&gt;"John Carter"&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt; };&lt;br&gt;
johnCarter.Director = new &lt;/span&gt;&lt;span style="font-family:Consolas;color:#2b91af;"&gt;Director&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt; {
Id = andrewStantonId };&lt;br&gt;
context.Movies.Add(johnCarter);&lt;br&gt;
context.SaveChanges();&lt;/span&gt;
&lt;p&gt;
SaveChanges() will save the new Movie- but it also saves a new Director record (which
gets a new Id, even though you set it manually). When you add an entity to a DbSet,
the entire object graph is marked as “Added”.
&lt;/p&gt;
&lt;p&gt;
You could do a Find to load the Director record from the database, but it is a pointless
database access that you don’t need. It just needs to save the Movie record with a
known directorId. 
&lt;/p&gt;
&lt;p&gt;
In NHibernate you can use session.Load&amp;lt;Director&amp;gt;(andrewStantonId) which will
create an empty proxy object without hitting the database. Only if you use one of
the proxy properties (like director.Name) will it hit the database to load the record.
EF Code First doesn’t have this feature.
&lt;/p&gt;
&lt;p&gt;
One way round it to add a foreign key Id property to the Movie record:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Consolas;color:#000000;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public
virtual &lt;/span&gt;&lt;span style="font-family:Consolas;color:#2b91af;"&gt;Director&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt; Director
{ get; set; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int? DirectorId { get; set; }&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
You can then set the DirectorId directly. The two properties are not kept in step
automatically, so setting the DirectorId doesn’t cause Director to load from the database.
Foreign key Id properties are convenient, but your object model is “denormalized”.
&lt;/p&gt;
&lt;p&gt;
The alternative is to mark the dummy record as unchanged. There are two ways.
&lt;/p&gt;
&lt;p&gt;
One is to set the context.Entry state for the dummy reference AFTER the new record
has been added.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Consolas;color:#000000;"&gt;var johnCarter = new &lt;/span&gt;&lt;span style="font-family:Consolas;color:#2b91af;"&gt;Movie&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt;()
{ Title = &lt;/span&gt;&lt;span style="font-family:Consolas;color:#a31515;"&gt;"John Carter"&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt; };&lt;br&gt;
johnCarter.DirectorId = andrewStantonId;&lt;br&gt;
context.Movies.Add(johnCarter);&lt;br&gt;
//after it's added, change the status of the reference&lt;br&gt;
context.Entry(johnCarter.Director).State = &lt;/span&gt;&lt;span style="font-family:Consolas;color:#2b91af;"&gt;EntityState&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt;.Unchanged;&lt;br&gt;
context.SaveChanges();&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
The second way is to create the dummy reference by Attaching it.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="font-family:Consolas;color:#000000;"&gt;//attach the dummy director record&lt;br&gt;
var andrewStanton = new &lt;/span&gt;&lt;span style="font-family:Consolas;color:#2b91af;"&gt;Director&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt; {
Id = andrewStantonId};&lt;br&gt;
context.Directors.Attach(andrewStanton);&lt;br&gt;
//now we have an "unchanged" director record to attach&lt;br&gt;
var johnCarter = new &lt;/span&gt;&lt;span style="font-family:Consolas;color:#2b91af;"&gt;Movie&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt;()
{ Title = &lt;/span&gt;&lt;span style="font-family:Consolas;color:#a31515;"&gt;"John Carter"&lt;/span&gt;&lt;span style="font-family:Consolas;color:#000000;"&gt; };&lt;br&gt;
johnCarter.Director = andrewStanton;&lt;br&gt;
context.Movies.Add(johnCarter);&lt;br&gt;
context.SaveChanges();&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=8549925c-fb0f-4dad-8ed4-29cf8db8132b" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,8549925c-fb0f-4dad-8ed4-29cf8db8132b.aspx</comments>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=97450ee5-6411-4ea0-9d1d-e6714fbf454d</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,97450ee5-6411-4ea0-9d1d-e6714fbf454d.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,97450ee5-6411-4ea0-9d1d-e6714fbf454d.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=97450ee5-6411-4ea0-9d1d-e6714fbf454d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">When you are a detached entity returns
from the UI, you normally save the update like this:<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">public</span> <span style="color:blue;">void</span> UpdateMovie(<span style="color:#2b91af;">Movie</span> movie)
{     <span style="color:blue;">using</span> (<span style="color:blue;">var</span> context = <span style="color:blue;">new</span> <span style="color:#2b91af;">DomainContext</span>())
    {         <span style="color:green;">//attach it</span>         context.Movies.Attach(movie);
        <span style="color:green;">//mark it as modified</span>         context.Entry(movie).State = <span style="color:#2b91af;">EntityState</span>.Modified;
        <span style="color:green;">//save - but saves all properties...</span>         context.SaveChanges();
    } }</pre>The update property saves all the properties - but
what if we only wanted to save certain properties? Like this:<br />
update [dbo].[Movies]<br />
set [BoxOffice] = @0<br />
where ([Id] = @1)<br /><br />
The safest way is to do it manually (and you avoid mass assignment vulnerabilities).
You have to reload the entity from the database.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">public</span> <span style="color:blue;">void</span> UpdateMovieBoxOffice(<span style="color:#2b91af;">Movie</span> movie)
{     <span style="color:blue;">using</span> (<span style="color:blue;">var</span> context = <span style="color:blue;">new</span> <span style="color:#2b91af;">DomainContext</span>())
    {         <span style="color:green;">//get database version</span>         <span style="color:blue;">var</span> databaseMovie = context.Movies.Find(movie.Id);
        <span style="color:green;">//manually copy the values</span>         databaseMovie.BoxOffice = movie.BoxOffice;
        <span style="color:green;">//save</span>         context.SaveChanges();
    } }</pre>The UI may be able to track changes (IPropertyNotifyChanged
or similar) and give the data service a list of the changed properties. If so, we
can use the context.Entry to specify the modified properties. The SQL UPDATE statement
will update only those properties.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">public</span> <span style="color:blue;">void</span> UpdateMovieProperties(<span style="color:#2b91af;">Movie</span> movie, <span style="color:#2b91af;">IList</span>&lt;<span style="color:blue;">string</span>&gt; propertyNames)
{     <span style="color:blue;">using</span> (<span style="color:blue;">var</span> context = <span style="color:blue;">new</span> <span style="color:#2b91af;">DomainContext</span>())
    {         <span style="color:green;">//attach it</span>         context.Movies.Attach(movie);
        <span style="color:green;">//use the context entry</span>         <span style="color:#2b91af;">DbEntityEntry</span>&lt;<span style="color:#2b91af;">Movie</span>&gt; entry = context.Entry(movie);
        <span style="color:blue;">foreach</span> (<span style="color:blue;">var</span> propertyName <span style="color:blue;">in</span> propertyNames)
        {             <span style="color:green;">//modify the specific property states only</span>             entry.Property(propertyName).IsModified = <span style="color:blue;">true</span>;
        }         <span style="color:green;">//save</span>         context.SaveChanges();
    } }<br /><br /></pre>The other way is to detect the changes by comparing them to the database. This
is similar to the second method, but we use entry.GetDatabaseValues() to get the database
values and then compare them. As only the changed properties are marked as modified,
the UPDATE statement uses only those properties.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">public</span> <span style="color:blue;">void</span> UpdateMovieChangedProperties(<span style="color:#2b91af;">Movie</span> movie)
{     <span style="color:blue;">using</span> (<span style="color:blue;">var</span> context = <span style="color:blue;">new</span> <span style="color:#2b91af;">DomainContext</span>())
    {         <span style="color:green;">//attach it</span>         context.Movies.Attach(movie);
        <span style="color:green;">//use the context entry</span>         <span style="color:#2b91af;">DbEntityEntry</span>&lt;<span style="color:#2b91af;">Movie</span>&gt; entry = context.Entry(movie);
        <span style="color:green;">//do a database call to get the state</span>         <span style="color:blue;">var</span> databaseValues = entry.GetDatabaseValues();
        <span style="color:blue;">foreach</span> (<span style="color:blue;">var</span> propertyName <span style="color:blue;">in</span> databaseValues.PropertyNames)
        {             <span style="color:green;">//modify the specific property states only</span>             entry.Property(propertyName).IsModified = <span style="color:blue;">true</span>;
        }         <span style="color:green;">//save</span>         context.SaveChanges();
    } }</pre>We don't take account of Complex Properties here
(the DbPropertyEntries can be nested).<br /><br /><br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=97450ee5-6411-4ea0-9d1d-e6714fbf454d" /></body>
      <title>EF Code First - Updating changed values only</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,97450ee5-6411-4ea0-9d1d-e6714fbf454d.aspx</guid>
      <link>http://martinwilley.com/blog/2012/03/17/EFCodeFirstUpdatingChangedValuesOnly.aspx</link>
      <pubDate>Sat, 17 Mar 2012 10:56:43 GMT</pubDate>
      <description>When you are a detached entity returns from the UI, you normally save the update like this:&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&amp;nbsp;UpdateMovie(&lt;span style="color:#2b91af;"&gt;Movie&lt;/span&gt;&amp;nbsp;movie)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;DomainContext&lt;/span&gt;())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//attach&amp;nbsp;it&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Movies.Attach(movie);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//mark&amp;nbsp;it&amp;nbsp;as&amp;nbsp;modified&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Entry(movie).State&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;EntityState&lt;/span&gt;.Modified;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//save&amp;nbsp;-&amp;nbsp;but&amp;nbsp;saves&amp;nbsp;all&amp;nbsp;properties...&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.SaveChanges();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} }&lt;/pre&gt;The update property saves all the properties - but
what if we only wanted to save certain properties? Like this:&lt;br&gt;
update [dbo].[Movies]&lt;br&gt;
set [BoxOffice] = @0&lt;br&gt;
where ([Id] = @1)&lt;br&gt;
&lt;br&gt;
The safest way is to do it manually (and you avoid mass assignment vulnerabilities).
You have to reload the entity from the database.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&amp;nbsp;UpdateMovieBoxOffice(&lt;span style="color:#2b91af;"&gt;Movie&lt;/span&gt;&amp;nbsp;movie)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;DomainContext&lt;/span&gt;())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//get&amp;nbsp;database&amp;nbsp;version&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;databaseMovie&amp;nbsp;=&amp;nbsp;context.Movies.Find(movie.Id);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//manually&amp;nbsp;copy&amp;nbsp;the&amp;nbsp;values&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;databaseMovie.BoxOffice&amp;nbsp;=&amp;nbsp;movie.BoxOffice;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//save&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.SaveChanges();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} }&lt;/pre&gt;The UI may be able to track changes (IPropertyNotifyChanged
or similar) and give the data service a list of the changed properties. If so, we
can use the context.Entry to specify the modified properties. The SQL UPDATE statement
will update only those properties.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&amp;nbsp;UpdateMovieProperties(&lt;span style="color:#2b91af;"&gt;Movie&lt;/span&gt;&amp;nbsp;movie,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;nbsp;propertyNames)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;DomainContext&lt;/span&gt;())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//attach&amp;nbsp;it&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Movies.Attach(movie);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//use&amp;nbsp;the&amp;nbsp;context&amp;nbsp;entry&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;DbEntityEntry&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Movie&lt;/span&gt;&amp;gt;&amp;nbsp;entry&amp;nbsp;=&amp;nbsp;context.Entry(movie);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;propertyName&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;propertyNames)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//modify&amp;nbsp;the&amp;nbsp;specific&amp;nbsp;property&amp;nbsp;states&amp;nbsp;only&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry.Property(propertyName).IsModified&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//save&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.SaveChanges();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} }&lt;br&gt;
&lt;br&gt;
&lt;/pre&gt;The other way is to detect the changes by comparing them to the database. This
is similar to the second method, but we use entry.GetDatabaseValues() to get the database
values and then compare them. As only the changed properties are marked as modified,
the UPDATE statement uses only those properties.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;void&lt;/span&gt;&amp;nbsp;UpdateMovieChangedProperties(&lt;span style="color:#2b91af;"&gt;Movie&lt;/span&gt;&amp;nbsp;movie)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;DomainContext&lt;/span&gt;())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//attach&amp;nbsp;it&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Movies.Attach(movie);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//use&amp;nbsp;the&amp;nbsp;context&amp;nbsp;entry&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;DbEntityEntry&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Movie&lt;/span&gt;&amp;gt;&amp;nbsp;entry&amp;nbsp;=&amp;nbsp;context.Entry(movie);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//do&amp;nbsp;a&amp;nbsp;database&amp;nbsp;call&amp;nbsp;to&amp;nbsp;get&amp;nbsp;the&amp;nbsp;state&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;databaseValues&amp;nbsp;=&amp;nbsp;entry.GetDatabaseValues();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;propertyName&amp;nbsp;&lt;span style="color:blue;"&gt;in&lt;/span&gt;&amp;nbsp;databaseValues.PropertyNames)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//modify&amp;nbsp;the&amp;nbsp;specific&amp;nbsp;property&amp;nbsp;states&amp;nbsp;only&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry.Property(propertyName).IsModified&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//save&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.SaveChanges();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} }&lt;/pre&gt;We don't take account of Complex Properties here
(the DbPropertyEntries can be nested).&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=97450ee5-6411-4ea0-9d1d-e6714fbf454d" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,97450ee5-6411-4ea0-9d1d-e6714fbf454d.aspx</comments>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">In EF Code First, context.SaveChanges()
automatically does validations.<br />
But lazy loading can collide with validations.<br /><br />
In our model, a Product must have a Category.<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">public</span> <span style="color:blue;">class</span> <span style="color:#2b91af;">Product</span> {
    [<span style="color:#2b91af;">Key</span>]     <span style="color:blue;">public</span> <span style="color:blue;">int</span> ProductId { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
    [<span style="color:#2b91af;">Required</span>]     [<span style="color:#2b91af;">StringLength</span>(40)]
    <span style="color:blue;">public</span> <span style="color:blue;">string</span> ProductName { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
    [<span style="color:#2b91af;">Required</span>]     <span style="color:blue;">public</span> <span style="color:blue;">virtual</span> <span style="color:#2b91af;">Category</span> Category { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }
}</pre><br />
Let's try this...<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">using</span> (<span style="color:blue;">var</span> context = <span style="color:blue;">new</span> <span style="color:#2b91af;">NorthwindContext</span>())
{     <span style="color:green;">//find a specific product</span>     <span style="color:blue;">var</span> product = context.Products.Find(147);
    <span style="color:green;">//set a new name</span>     product.ProductName = <span style="color:#2b91af;">Guid</span>.NewGuid().ToString();
    <span style="color:green;">//ERROR!</span>     context.SaveChanges();
}</pre><br /><br />
Oh no, System.Data.Entity.Validation.DbEntityValidationException. "Validation failed
for one or more entities." How can that be? We just loaded it from the database, it
must be correct?<br />
The exception says that Category is null. But it exists in the database. 
<br /><br />
If you inspect it in the debugger, you can see the category ... and if you continue
the SaveChanges succeeds. The debugger triggered a lazy load, so it works.<br /><br />
context.SaveChanges() internally turns off lazy loading before validating. Which is
good, because you don't want unnecessary database access. But when the reference is
required, the validation doesn't recognise this is a proxy which has a categoryId
but hasn't loaded it.<br /><br /><h2>Solution 1- no auto validation
</h2><br />
One solution is to turn off validation. When you are setting individual properties
with values you've already validated, you do not need it here.<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">context.Configuration.ValidateOnSaveEnabled = <span style="color:blue;">false</span>;
context.SaveChanges(); </pre><br />
The SQL, by the way, is update [dbo].[Products] set [ProductName] = @0 where ([ProductID]
= @1).<br />
(Check it by hooking up a SQL logger, <a href="http://martinwilley.com/blog/2012/02/14/EFCodeFirstTracingLoggingTheSQL.aspx">as
described here</a>)<br /><br />
An alternative is to cheat the model- ensure references are not Required. 
<br /><br />
But if you have a product coming back from a UI for insert or update, you need to
manually validate that it always has a category. 
<br /><br /><h2>Solution 2- ensure required references are loaded
</h2><br />
This triggers extra database access, but you can keep the automatic validation.<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//find a specific product</span><span style="color:blue;">var</span> product = context.Products.Find(147); <span style="color:green;">//make sure it's loaded</span> context.Entry(product).Reference(p =&gt; p.Category).Load();</pre><br />
If you load from a query, you can use an .Include(p =&gt; p.Category) which will load
the product with a join to the category table, so there is only one sql statement.
This will bypass the internal cache so if it was loaded the same product earlier,
you can't save any data access.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">var</span> product = context.Products
    .Include(p =&gt; p.Category)     .First(p =&gt; p.ProductId == 147);</pre><br /><h2>Solution 3- Add a foreign key Id property
</h2><br />
You can specify foreign key Id properties in addition to the instance property.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//it's not nullable so it's implicitly required</span><span style="color:blue;">public</span><span style="color:blue;">int</span> CategoryId { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; } <span style="color:blue;">public</span> <span style="color:blue;">virtual</span> <span style="color:#2b91af;">Category</span> Category { <span style="color:blue;">get</span>; <span style="color:blue;">set</span>; }</pre><br /><br />
Note the CategoryId is now required. The Category instance isn't. Validation can check
the CategoryId, and we can set it directly without having to load the instance.<br /><br />
You have to map this arrangement (unless you like to see an EntityCommandCompilationException
with the inner exception message being "More than one item in the metadata collection
match the identity 'CategoryId'." - I didn't).<br />
In the EntityTypeConfiguration&lt;Product&gt; the mapping must point to the foreign
key id property. 
<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">HasRequired(x =&gt; x.Category)
    .WithMany()
    .HasForeignKey(p =&gt; p.CategoryId);</pre><br /><br />
We've "denormalized" our entity model here, but it makes dealing with detached objects
and viewmodels a little easier. 
<br /><br />
But won't the CategoryId and Category properties get out of step? If you set one,
which gets persisted? 
<br /><br />
Let's set the foreign key id property.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//find a specific product</span><span style="color:blue;">var</span> product = context.Products.Find(146); <span style="color:green;">//it's category 4 in both</span><span style="color:#2b91af;">Console</span>.WriteLine(product.Category.CategoryId); <span style="color:#2b91af;">Console</span>.WriteLine(product.CategoryId); <span style="color:green;">//set the categoryId property</span> product.CategoryId = 1; <span style="color:green;">//we've just set it, so it's 1</span><span style="color:#2b91af;">Console</span>.WriteLine(product.CategoryId); <span style="color:green;">//oh no, still says 4!</span><span style="color:#2b91af;">Console</span>.WriteLine(product.Category.CategoryId);</pre><br /><br />
context.SaveChanges() does the right thing- it saves the new value, 1, assigned to
the id property.<br /><br />
Let's set the instance.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//find a specific product</span><span style="color:blue;">var</span> product = context.Products.Find(146); <span style="color:green;">//it's category 1 in both</span><span style="color:#2b91af;">Console</span>.WriteLine(product.Category.CategoryId); <span style="color:#2b91af;">Console</span>.WriteLine(product.CategoryId); <span style="color:green;">//set the category instance</span> product.Category = context.Categories.Find(2); <span style="color:green;">//we've just set it, so it's 2</span><span style="color:#2b91af;">Console</span>.WriteLine(product.Category.CategoryId); <span style="color:green;">//oh no, still says 1!</span><span style="color:#2b91af;">Console</span>.WriteLine(product.CategoryId); </pre><br /><br />
But again, context.SaveChanges() does the right thing- it saves the new value, 2,
assigned to the instance.<br /><br />
So it looks like persistence always works as you'd expect, but the properties get
out of step. You must be careful in your workflow. This won't work...<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">product.CategoryId = 1;
<span style="color:blue;">var</span> returnMessage = <span style="color:#a31515;">"Category updated to "</span> + product.Category.CategoryName; </pre><br /><br /><h2>Conclusion
</h2>
In most cases I'd prefer to remove validation on save with context.Configuration.ValidateOnSaveEnabled
= false - as long as the values were validated downstream (perhaps in the UI validation
framework).<br /><br />
But exposing the foreign key property is undoubtably convenient when the UI just sends
you categoryId= 1 and you don't want to load that category from the database just
so you can persist product.<img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5" /></body>
      <title>EF Code First - references vs validation</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5.aspx</guid>
      <link>http://martinwilley.com/blog/2012/02/22/EFCodeFirstReferencesVsValidation.aspx</link>
      <pubDate>Wed, 22 Feb 2012 10:45:48 GMT</pubDate>
      <description>In EF Code First, context.SaveChanges() automatically does validations.&lt;br&gt;
But lazy loading can collide with validations.&lt;br&gt;
&lt;br&gt;
In our model, a Product must have a Category.&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Product&lt;/span&gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;Key&lt;/span&gt;] &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;nbsp;ProductId&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;Required&lt;/span&gt;] &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;StringLength&lt;/span&gt;(40)]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;ProductName&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&lt;span style="color:#2b91af;"&gt;Required&lt;/span&gt;] &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;&amp;nbsp;Category&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}
}&lt;/pre&gt;
&lt;br&gt;
Let's try this...&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;NorthwindContext&lt;/span&gt;())
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//find&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;product&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.Products.Find(147);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//set&amp;nbsp;a&amp;nbsp;new&amp;nbsp;name&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;product.ProductName&amp;nbsp;=&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Guid&lt;/span&gt;.NewGuid().ToString();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//ERROR!&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.SaveChanges();
}&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
Oh no, System.Data.Entity.Validation.DbEntityValidationException. "Validation failed
for one or more entities." How can that be? We just loaded it from the database, it
must be correct?&lt;br&gt;
The exception says that Category is null. But it exists in the database. 
&lt;br&gt;
&lt;br&gt;
If you inspect it in the debugger, you can see the category ... and if you continue
the SaveChanges succeeds. The debugger triggered a lazy load, so it works.&lt;br&gt;
&lt;br&gt;
context.SaveChanges() internally turns off lazy loading before validating. Which is
good, because you don't want unnecessary database access. But when the reference is
required, the validation doesn't recognise this is a proxy which has a categoryId
but hasn't loaded it.&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Solution 1- no auto validation
&lt;/h2&gt;
&lt;br&gt;
One solution is to turn off validation. When you are setting individual properties
with values you've already validated, you do not need it here.&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;context.Configuration.ValidateOnSaveEnabled&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;false&lt;/span&gt;;
context.SaveChanges(); &lt;/pre&gt;
&lt;br&gt;
The SQL, by the way, is update [dbo].[Products] set [ProductName] = @0 where ([ProductID]
= @1).&lt;br&gt;
(Check it by hooking up a SQL logger, &lt;a href="http://martinwilley.com/blog/2012/02/14/EFCodeFirstTracingLoggingTheSQL.aspx"&gt;as
described here&lt;/a&gt;)&lt;br&gt;
&lt;br&gt;
An alternative is to cheat the model- ensure references are not Required. 
&lt;br&gt;
&lt;br&gt;
But if you have a product coming back from a UI for insert or update, you need to
manually validate that it always has a category. 
&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Solution 2- ensure required references are loaded
&lt;/h2&gt;
&lt;br&gt;
This triggers extra database access, but you can keep the automatic validation.&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//find&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;product&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.Products.Find(147); &lt;span style="color:green;"&gt;//make&amp;nbsp;sure&amp;nbsp;it's&amp;nbsp;loaded&lt;/span&gt; context.Entry(product).Reference(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.Category).Load();&lt;/pre&gt;
&lt;br&gt;
If you load from a query, you can use an .Include(p =&amp;gt; p.Category) which will load
the product with a join to the category table, so there is only one sql statement.
This will bypass the internal cache so if it was loaded the same product earlier,
you can't save any data access.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.Products
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Include(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.Category) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.First(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.ProductId&amp;nbsp;==&amp;nbsp;147);&lt;/pre&gt;
&lt;br&gt;
&lt;h2&gt;Solution 3- Add a foreign key Id property
&lt;/h2&gt;
&lt;br&gt;
You can specify foreign key Id properties in addition to the instance property.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//it's&amp;nbsp;not&amp;nbsp;nullable&amp;nbsp;so&amp;nbsp;it's&amp;nbsp;implicitly&amp;nbsp;required&lt;/span&gt; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt;&amp;nbsp;CategoryId&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;} &lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Category&lt;/span&gt;&amp;nbsp;Category&amp;nbsp;{&amp;nbsp;&lt;span style="color:blue;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color:blue;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
Note the CategoryId is now required. The Category instance isn't. Validation can check
the CategoryId, and we can set it directly without having to load the instance.&lt;br&gt;
&lt;br&gt;
You have to map this arrangement (unless you like to see an EntityCommandCompilationException
with the inner exception message being "More than one item in the metadata collection
match the identity 'CategoryId'." - I didn't).&lt;br&gt;
In the EntityTypeConfiguration&amp;lt;Product&amp;gt; the mapping must point to the foreign
key id property. 
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;HasRequired(x&amp;nbsp;=&amp;gt;&amp;nbsp;x.Category)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.WithMany()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.HasForeignKey(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.CategoryId);&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
We've "denormalized" our entity model here, but it makes dealing with detached objects
and viewmodels a little easier. 
&lt;br&gt;
&lt;br&gt;
But won't the CategoryId and Category properties get out of step? If you set one,
which gets persisted? 
&lt;br&gt;
&lt;br&gt;
Let's set the foreign key id property.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//find&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;product&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.Products.Find(146); &lt;span style="color:green;"&gt;//it's&amp;nbsp;category&amp;nbsp;4&amp;nbsp;in&amp;nbsp;both&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.Category.CategoryId); &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.CategoryId); &lt;span style="color:green;"&gt;//set&amp;nbsp;the&amp;nbsp;categoryId&amp;nbsp;property&lt;/span&gt; product.CategoryId&amp;nbsp;=&amp;nbsp;1; &lt;span style="color:green;"&gt;//we've&amp;nbsp;just&amp;nbsp;set&amp;nbsp;it,&amp;nbsp;so&amp;nbsp;it's&amp;nbsp;1&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.CategoryId); &lt;span style="color:green;"&gt;//oh&amp;nbsp;no,&amp;nbsp;still&amp;nbsp;says&amp;nbsp;4!&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.Category.CategoryId);&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
context.SaveChanges() does the right thing- it saves the new value, 1, assigned to
the id property.&lt;br&gt;
&lt;br&gt;
Let's set the instance.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//find&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;product&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.Products.Find(146); &lt;span style="color:green;"&gt;//it's&amp;nbsp;category&amp;nbsp;1&amp;nbsp;in&amp;nbsp;both&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.Category.CategoryId); &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.CategoryId); &lt;span style="color:green;"&gt;//set&amp;nbsp;the&amp;nbsp;category&amp;nbsp;instance&lt;/span&gt; product.Category&amp;nbsp;=&amp;nbsp;context.Categories.Find(2); &lt;span style="color:green;"&gt;//we've&amp;nbsp;just&amp;nbsp;set&amp;nbsp;it,&amp;nbsp;so&amp;nbsp;it's&amp;nbsp;2&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.Category.CategoryId); &lt;span style="color:green;"&gt;//oh&amp;nbsp;no,&amp;nbsp;still&amp;nbsp;says&amp;nbsp;1!&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(product.CategoryId); &lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
But again, context.SaveChanges() does the right thing- it saves the new value, 2,
assigned to the instance.&lt;br&gt;
&lt;br&gt;
So it looks like persistence always works as you'd expect, but the properties get
out of step. You must be careful in your workflow. This won't work...&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;product.CategoryId&amp;nbsp;=&amp;nbsp;1;
&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;returnMessage&amp;nbsp;=&amp;nbsp;&lt;span style="color:#a31515;"&gt;"Category&amp;nbsp;updated&amp;nbsp;to&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;product.Category.CategoryName; &lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
&lt;h2&gt;Conclusion
&lt;/h2&gt;
In most cases I'd prefer to remove validation on save with context.Configuration.ValidateOnSaveEnabled
= false - as long as the values were validated downstream (perhaps in the UI validation
framework).&lt;br&gt;
&lt;br&gt;
But exposing the foreign key property is undoubtably convenient when the UI just sends
you categoryId= 1 and you don't want to load that category from the database just
so you can persist product.&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,b9bb812a-e5ee-493b-b2fd-0c05ac0bf6b5.aspx</comments>
      <category>.net 4</category>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=0962d088-7f49-4c99-ab21-6fccc4e9b2dd</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,0962d088-7f49-4c99-ab21-6fccc4e9b2dd.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,0962d088-7f49-4c99-ab21-6fccc4e9b2dd.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=0962d088-7f49-4c99-ab21-6fccc4e9b2dd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">There is a risk of unbounded result sets
when using navigation collections.<br /><br />
If you try to do paging (Skip/Take) on a navigation collection, you actually load
all the related entities and then page in memory. Opps.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:green;">//unbounded result set - there could be 1000s!</span><span style="color:blue;">var</span> products = category.Products
    .OrderBy(p =&gt; p.ProductName) <span style="color:green;">//you have to order</span>     .Skip((page - 1) * pageSize)
    .Take(pageSize);</pre>You have the same issue with a simple
.Count, as <a href="http://martinwilley.com/blog/2012/02/16/EFCodeFirstNavigationPropertyCounts.aspx">shown
in my last post</a>.<br /><br />
The solutions are the same. You can use a filter directly on the products DbSet.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">var</span> pagedProductsByCategory = context.Products
    <span style="color:green;">//have to specify primary keys here- can't match on "category"</span>     .Where(p =&gt; p.Category.CategoryId == category.CategoryId)
    .OrderBy(p =&gt; p.ProductName) <span style="color:green;">//you have to order</span>     .Skip((page - 1) * pageSize)
    .Take(pageSize);</pre>Or you can use the context.Entry(x).Collection(y).Query().
This is the equivalent of an <a href="http://www.martinwilley.com/net/code/nhibernate/advanced.html">NHibernate
CreateFilter</a>.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">var</span> pagedProducts = context.Entry(category)
    <span style="color:green;">//from the DbEntityEntry, get the navigation property</span>     .Collection(x =&gt; x.Products)
    <span style="color:green;">//turn it into a query</span>     .Query()
    <span style="color:green;">//page</span>     .OrderBy(p =&gt; p.ProductName) <span style="color:green;">//you have to order</span>     .Skip((page - 1) * pageSize)
    .Take(pageSize);</pre>To remove temptation, you might want
to remove the collection navigation property. In this case, category has no Products
collection (the many end of the foreign key), but Product has a Category property
(the 0.1 end of the foreign key). 
<br /><br />
You can specify the mapping in an EntityTypeConfiguration&lt;Product&gt; class map.
Because the many end isn't defined, you use an empty .WithMany().<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">HasOptional(x =&gt; x.Category)
    .WithMany() <span style="color:green;">//.WithMany(c =&gt; c.Products)</span>     .Map(m =&gt; m.MapKey(<span style="color:#a31515;">"CategoryID"</span>));</pre><br />
Remember you can (and should) be profiling your generated SQL, for instance with the
EFTracingProvder <a href="http://martinwilley.com/blog/2012/02/14/EFCodeFirstTracingLoggingTheSQL.aspx">as
shown here</a>.<br /><br /><br /><br /><br /><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=0962d088-7f49-4c99-ab21-6fccc4e9b2dd" /></body>
      <title>EF Code First - navigation collection paging</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,0962d088-7f49-4c99-ab21-6fccc4e9b2dd.aspx</guid>
      <link>http://martinwilley.com/blog/2012/02/17/EFCodeFirstNavigationCollectionPaging.aspx</link>
      <pubDate>Fri, 17 Feb 2012 06:37:58 GMT</pubDate>
      <description>There is a risk of unbounded result sets when using navigation collections.&lt;br&gt;
&lt;br&gt;
If you try to do paging (Skip/Take) on a navigation collection, you actually load
all the related entities and then page in memory. Opps.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:green;"&gt;//unbounded&amp;nbsp;result&amp;nbsp;set&amp;nbsp;-&amp;nbsp;there&amp;nbsp;could&amp;nbsp;be&amp;nbsp;1000s!&lt;/span&gt; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;products&amp;nbsp;=&amp;nbsp;category.Products
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.OrderBy(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.ProductName)&amp;nbsp;&lt;span style="color:green;"&gt;//you&amp;nbsp;have&amp;nbsp;to&amp;nbsp;order&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Skip((page&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;pageSize)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Take(pageSize);&lt;/pre&gt;You have the same issue with a simple
.Count, as &lt;a href="http://martinwilley.com/blog/2012/02/16/EFCodeFirstNavigationPropertyCounts.aspx"&gt;shown
in my last post&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
The solutions are the same. You can use a filter directly on the products DbSet.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;pagedProductsByCategory&amp;nbsp;=&amp;nbsp;context.Products
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//have&amp;nbsp;to&amp;nbsp;specify&amp;nbsp;primary&amp;nbsp;keys&amp;nbsp;here-&amp;nbsp;can't&amp;nbsp;match&amp;nbsp;on&amp;nbsp;"category"&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Where(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.Category.CategoryId&amp;nbsp;==&amp;nbsp;category.CategoryId)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.OrderBy(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.ProductName)&amp;nbsp;&lt;span style="color:green;"&gt;//you&amp;nbsp;have&amp;nbsp;to&amp;nbsp;order&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Skip((page&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;pageSize)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Take(pageSize);&lt;/pre&gt;Or you can use the context.Entry(x).Collection(y).Query().
This is the equivalent of an &lt;a href="http://www.martinwilley.com/net/code/nhibernate/advanced.html"&gt;NHibernate
CreateFilter&lt;/a&gt;.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;pagedProducts&amp;nbsp;=&amp;nbsp;context.Entry(category)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//from&amp;nbsp;the&amp;nbsp;DbEntityEntry,&amp;nbsp;get&amp;nbsp;the&amp;nbsp;navigation&amp;nbsp;property&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Collection(x&amp;nbsp;=&amp;gt;&amp;nbsp;x.Products)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//turn&amp;nbsp;it&amp;nbsp;into&amp;nbsp;a&amp;nbsp;query&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Query()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//page&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.OrderBy(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.ProductName)&amp;nbsp;&lt;span style="color:green;"&gt;//you&amp;nbsp;have&amp;nbsp;to&amp;nbsp;order&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Skip((page&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;pageSize)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Take(pageSize);&lt;/pre&gt;To remove temptation, you might want
to remove the collection navigation property. In this case, category has no Products
collection (the many end of the foreign key), but Product has a Category property
(the 0.1 end of the foreign key). 
&lt;br&gt;
&lt;br&gt;
You can specify the mapping in an EntityTypeConfiguration&amp;lt;Product&amp;gt; class map.
Because the many end isn't defined, you use an empty .WithMany().&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;HasOptional(x&amp;nbsp;=&amp;gt;&amp;nbsp;x.Category)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.WithMany()&amp;nbsp;&lt;span style="color:green;"&gt;//.WithMany(c&amp;nbsp;=&amp;gt;&amp;nbsp;c.Products)&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Map(m&amp;nbsp;=&amp;gt;&amp;nbsp;m.MapKey(&lt;span style="color:#a31515;"&gt;"CategoryID"&lt;/span&gt;));&lt;/pre&gt;
&lt;br&gt;
Remember you can (and should) be profiling your generated SQL, for instance with the
EFTracingProvder &lt;a href="http://martinwilley.com/blog/2012/02/14/EFCodeFirstTracingLoggingTheSQL.aspx"&gt;as
shown here&lt;/a&gt;.&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=0962d088-7f49-4c99-ab21-6fccc4e9b2dd" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,0962d088-7f49-4c99-ab21-6fccc4e9b2dd.aspx</comments>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=41779796-427b-4387-9d1e-e54fa80f6c11</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,41779796-427b-4387-9d1e-e54fa80f6c11.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,41779796-427b-4387-9d1e-e54fa80f6c11.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=41779796-427b-4387-9d1e-e54fa80f6c11</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Watch out for unbounded result sets when
using navigation properties.<br /><br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">using</span> (<span style="color:blue;">var</span> context = <span style="color:blue;">new</span> <span style="color:#2b91af;">NorthwindContext</span>(<span style="color:#a31515;"></span>)))
{     <span style="color:blue;">var</span> category = context.Categories.Find(1); <span style="color:green;">//Beverages</span>     <span style="color:#2b91af;">Console</span>.WriteLine(category.Products.Count);<br />
}<br /></pre><p>
This loads ALL the products for the category, and then counts them.
</p><p>
Fine for a small result set, not so good if you have 1000s of products per category.
</p><p>
Simple solution: use a filter on products.
</p><pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"><span style="color:#2b91af;">Console</span>.WriteLine(context.Products
    .Count(p =&gt; p.Category.CategoryId == category.CategoryId));<br /></pre><p>
This generates SQL in the form "SELECT COUNT(*) FROM Products WHERE CategoryID = @p"
</p><p>
Alternative solution: use context.Entry with .Query()
</p><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:#2b91af;">Console</span>.WriteLine(context.Entry(category)
    .Collection(x =&gt; x.Products)     .Query()
    .Count());</pre><pre style="font-family:Consolas;font-size:13;color:black;background:white;"></pre><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=41779796-427b-4387-9d1e-e54fa80f6c11" /></body>
      <title>EF Code First - navigation property counts</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,41779796-427b-4387-9d1e-e54fa80f6c11.aspx</guid>
      <link>http://martinwilley.com/blog/2012/02/16/EFCodeFirstNavigationPropertyCounts.aspx</link>
      <pubDate>Thu, 16 Feb 2012 12:53:47 GMT</pubDate>
      <description>Watch out for unbounded result sets when using navigation properties.&lt;br&gt;
&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;NorthwindContext&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&lt;/span&gt;)))
{ &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;category&amp;nbsp;=&amp;nbsp;context.Categories.Find(1);&amp;nbsp;&lt;span style="color:green;"&gt;//Beverages&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(category.Products.Count);&lt;br&gt;
}&lt;br&gt;
&lt;/pre&gt;
&lt;p&gt;
This loads ALL the products for the category, and then counts them.
&lt;/p&gt;
&lt;p&gt;
Fine for a small result set, not so good if you have 1000s of products per category.
&lt;/p&gt;
&lt;p&gt;
Simple solution: use a filter on products.
&lt;/p&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(context.Products
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Count(p&amp;nbsp;=&amp;gt;&amp;nbsp;p.Category.CategoryId&amp;nbsp;==&amp;nbsp;category.CategoryId));&lt;br&gt;
&lt;/pre&gt;
&lt;p&gt;
This generates SQL in the form "SELECT COUNT(*) FROM Products WHERE CategoryID = @p"
&lt;/p&gt;
&lt;p&gt;
Alternative solution: use context.Entry with .Query()
&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(context.Entry(category)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Collection(x&amp;nbsp;=&amp;gt;&amp;nbsp;x.Products) &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Query()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Count());&lt;/pre&gt;&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;/pre&gt;&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=41779796-427b-4387-9d1e-e54fa80f6c11" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,41779796-427b-4387-9d1e-e54fa80f6c11.aspx</comments>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=ce15092e-2857-450d-b20f-534afedd5d2f</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,ce15092e-2857-450d-b20f-534afedd5d2f.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <georss:point>0 0</georss:point>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,ce15092e-2857-450d-b20f-534afedd5d2f.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ce15092e-2857-450d-b20f-534afedd5d2f</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">I wanted to log the SQL so I can profile
a Entity Framework Code First application.<br /><br /><a href="http://code.google.com/p/mvc-mini-profiler/">MVC Mini-Profiler</a> only works
in an ASP MVC application- not in console or unit tests. 
<br /><br />
The <a href="http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32">tracing and
caching providers for Entity Framework</a> expect ObjectContexts (EF 4.0), not DbContexts.
But we can make them work. 
<br /><br />
Scenario:<br />
I have a code first project with my DbContext, called NorthwindContext.<br />
I have a unit test project, with a test that uses NorthwindContext<br /><br />
Here's the steps.<br /><br />
1. Download the <a href="http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32">providers</a>.<br />
2 (Optional): review the Q&amp;A and apply some of the suggested patches.<br />
3. Build the solution.<br />
4. The unit test project will reference the dlls from the tracing provider<br />
EFProviderWrapperToolkit.dll<br />
EFTracingProvider.dll<br />
5. Add an App.config to the unit test project something like this:<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">&lt;?</span><span style="color:#a31515;">xml</span><span style="color:blue;"> </span><span style="color:red;">version</span><span style="color:blue;">=</span>"<span style="color:blue;">1.0</span>"<span style="color:blue;"> </span><span style="color:red;">encoding</span><span style="color:blue;">=</span>"<span style="color:blue;">utf-8</span>"<span style="color:blue;">?&gt;</span><span style="color:blue;">&lt;</span><span style="color:#a31515;">configuration</span><span style="color:blue;">&gt;</span><span style="color:blue;"></span><span style="color:blue;"> 
&lt;</span><span style="color:#a31515;">connectionStrings</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">add</span><span style="color:blue;"> </span><span style="color:red;">name</span><span style="color:blue;">=</span>"<span style="color:blue;">NorthwindContext</span>"<span style="color:blue;"> </span><span style="color:blue;">         </span><span style="color:red;">providerName</span><span style="color:blue;">=</span>"<span style="color:blue;">System.Data.SqlClient</span>"<span style="color:blue;"> </span><span style="color:blue;">         </span><span style="color:red;">connectionString</span><span style="color:blue;">=</span>"<span style="color:blue;">Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">connectionStrings</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;</span><span style="color:#a31515;">system.data</span><span style="color:blue;">&gt;</span><span style="color:blue;">    &lt;</span><span style="color:#a31515;">DbProviderFactories</span><span style="color:blue;">&gt;</span><span style="color:blue;">      &lt;</span><span style="color:#a31515;">add</span><span style="color:blue;"> </span><span style="color:red;">name</span><span style="color:blue;">=</span>"<span style="color:blue;">EF Tracing Data Provider</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">invariant</span><span style="color:blue;">=</span>"<span style="color:blue;">EFTracingProvider</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">description</span><span style="color:blue;">=</span>"<span style="color:blue;">Tracing Provider Wrapper</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">type</span><span style="color:blue;">=</span>"<span style="color:blue;">EFTracingProvider.EFTracingProviderFactory, EFTracingProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">      &lt;</span><span style="color:#a31515;">add</span><span style="color:blue;"> </span><span style="color:red;">name</span><span style="color:blue;">=</span>"<span style="color:blue;">EF Generic Provider Wrapper</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">invariant</span><span style="color:blue;">=</span>"<span style="color:blue;">EFProviderWrapper</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">description</span><span style="color:blue;">=</span>"<span style="color:blue;">Generic Provider Wrapper</span>"<span style="color:blue;"> </span><span style="color:blue;">           </span><span style="color:red;">type</span><span style="color:blue;">=</span>"<span style="color:blue;">EFProviderWrapperToolkit.EFProviderWrapperFactory, EFProviderWrapperToolkit, Version=1.0.0.0, Culture=neutral, PublicKeyToken=def642f226e0e59b</span>"<span style="color:blue;"> /&gt;</span><span style="color:blue;">    &lt;/</span><span style="color:#a31515;">DbProviderFactories</span><span style="color:blue;">&gt;</span><span style="color:blue;">  &lt;/</span><span style="color:#a31515;">system.data</span><span style="color:blue;">&gt;</span><span style="color:blue;">&lt;/</span><span style="color:#a31515;">configuration</span><span style="color:blue;">&gt;</span></pre>6.
In the DbContext, we need to use two of the base constructors<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">        <span style="color:blue;">public</span> NorthwindContext()
        {             <span style="color:green;">//default ctor, uses app.config connection string named "NorthwindContext"</span>         }
        <span style="color:blue;">public</span> NorthwindContext(<span style="color:#2b91af;">DbConnection</span> connection)
            :<span style="color:blue;">base</span>(connection,<span style="color:blue;">true</span>)
        {            <span style="color:green;">//ctor uses for tracing </span>         }</pre>7.
In my test, you need to use the overload that takes the DbConnection.<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;">            <span style="color:blue;">using</span> (<span style="color:blue;">var</span> context = <span style="color:blue;">new</span> <span style="color:#2b91af;">NorthwindContext</span>(
                CreateConnectionWrapper(<span style="color:#a31515;">@"name=NorthwindContext"</span>)))
            {                 <span style="color:green;">//profile this!</span>                 <span style="color:blue;">var</span> product = context.ProductCollection.Find(1);
            }</pre>8.
And add the CreateConnectionWrapper method:<br /><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><span style="color:blue;">private</span> <span style="color:blue;">static</span> <span style="color:#2b91af;">DbConnection</span> CreateConnectionWrapper(<span style="color:blue;">string</span> nameOrConnectionString)
{     <span style="color:blue;">var</span> providerInvariantName = <span style="color:#a31515;">"System.Data.SqlClient"</span>;
    <span style="color:blue;">var</span> connectionString = nameOrConnectionString;
    <span style="color:green;">//name=connectionName format</span>     <span style="color:blue;">var</span> index = nameOrConnectionString.IndexOf(<span style="color:#a31515;">'='</span>);
    <span style="color:blue;">if</span> (index &gt; 0 &amp;&amp;
nameOrConnectionString.Substring(0, index).Trim()         .Equals(<span style="color:#a31515;">"name"</span>, <span style="color:#2b91af;">StringComparison</span>.OrdinalIgnoreCase))
    {         nameOrConnectionString = nameOrConnectionString
            .Substring(index + 1).Trim();
    }     <span style="color:green;">//look up connection string name</span>     <span style="color:blue;">var</span> connectionStringSetting =
        <span style="color:#2b91af;">ConfigurationManager</span>.ConnectionStrings[nameOrConnectionString];
    <span style="color:blue;">if</span> (connectionStringSetting != <span style="color:blue;">null</span>)
    {         providerInvariantName = connectionStringSetting.ProviderName;
        connectionString = connectionStringSetting.ConnectionString;
    }     <span style="color:green;">//create the special connection string with the provider name in it</span>     <span style="color:blue;">var</span> wrappedConnectionString = <span style="color:#a31515;">"wrappedProvider="</span> + 
        providerInvariantName + <span style="color:#a31515;">";"</span> + 
        connectionString;     <span style="color:green;">//create the tracing wrapper</span>     <span style="color:blue;">var</span> connection = <span style="color:blue;">new</span> <span style="color:#2b91af;">EFTracingConnection</span>                             {
                                ConnectionString = wrappedConnectionString
                            };
    <span style="color:green;">//hook up logging here</span>     connection.CommandFinished +=
        (sender, args) =&gt; <span style="color:#2b91af;">Console</span>.WriteLine(args.ToTraceString());
    <span style="color:blue;">return</span> connection; }</pre>This
should cope with connection strings in the 3 common forms ("Northwind", "name=Northwind"
and "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind ...")<br /><br />
Note the line to hook up logging (subscribing to the connection.CommandFinished event).
We could simply have used 
<br /><pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"><span style="color:#2b91af;">EFTracingProviderConfiguration</span>.LogToConsole = <span style="color:blue;">true</span>; 
<br /></pre><p>
Or you can hook up to log4net or EntLib logging to those tracing events. 
<br /></p><p><br /></p><pre style="font-family:Consolas;font-size:13;color:black;background:white;"><br /></pre><p></p><img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=ce15092e-2857-450d-b20f-534afedd5d2f" /></body>
      <title>EF Code First tracing - logging the SQL</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,ce15092e-2857-450d-b20f-534afedd5d2f.aspx</guid>
      <link>http://martinwilley.com/blog/2012/02/14/EFCodeFirstTracingLoggingTheSQL.aspx</link>
      <pubDate>Tue, 14 Feb 2012 13:11:00 GMT</pubDate>
      <description>I wanted to log the SQL so I can profile a Entity Framework Code First application.&lt;br&gt;
&lt;br&gt;
&lt;a href="http://code.google.com/p/mvc-mini-profiler/"&gt;MVC Mini-Profiler&lt;/a&gt; only works
in an ASP MVC application- not in console or unit tests. 
&lt;br&gt;
&lt;br&gt;
The &lt;a href="http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32"&gt;tracing and
caching providers for Entity Framework&lt;/a&gt; expect ObjectContexts (EF 4.0), not DbContexts.
But we can make them work. 
&lt;br&gt;
&lt;br&gt;
Scenario:&lt;br&gt;
I have a code first project with my DbContext, called NorthwindContext.&lt;br&gt;
I have a unit test project, with a test that uses NorthwindContext&lt;br&gt;
&lt;br&gt;
Here's the steps.&lt;br&gt;
&lt;br&gt;
1. Download the &lt;a href="http://code.msdn.microsoft.com/EFProviderWrappers-c0b88f32"&gt;providers&lt;/a&gt;.&lt;br&gt;
2 (Optional): review the Q&amp;amp;A and apply some of the suggested patches.&lt;br&gt;
3. Build the solution.&lt;br&gt;
4. The unit test project will reference the dlls from the tracing provider&lt;br&gt;
EFProviderWrapperToolkit.dll&lt;br&gt;
EFTracingProvider.dll&lt;br&gt;
5. Add an App.config to the unit test project something like this:&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;"&lt;span style="color:blue;"&gt;?&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;NorthwindContext&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;providerName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.Data.SqlClient&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;connectionString&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Data&amp;nbsp;Source=.\SQLEXPRESS;Initial&amp;nbsp;Catalog=Northwind;Integrated&amp;nbsp;Security=True;Pooling=False;MultipleActiveResultSets=True&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.data&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DbProviderFactories&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EF&amp;nbsp;Tracing&amp;nbsp;Data&amp;nbsp;Provider&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;invariant&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EFTracingProvider&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Tracing&amp;nbsp;Provider&amp;nbsp;Wrapper&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EFTracingProvider.EFTracingProviderFactory,&amp;nbsp;EFTracingProvider,&amp;nbsp;Version=1.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=def642f226e0e59b&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EF&amp;nbsp;Generic&amp;nbsp;Provider&amp;nbsp;Wrapper&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;invariant&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EFProviderWrapper&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;description&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Generic&amp;nbsp;Provider&amp;nbsp;Wrapper&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;EFProviderWrapperToolkit.EFProviderWrapperFactory,&amp;nbsp;EFProviderWrapperToolkit,&amp;nbsp;Version=1.0.0.0,&amp;nbsp;Culture=neutral,&amp;nbsp;PublicKeyToken=def642f226e0e59b&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;nbsp;/&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;DbProviderFactories&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;system.data&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;6.
In the DbContext, we need to use two of the base constructors&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;NorthwindContext()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//default&amp;nbsp;ctor,&amp;nbsp;uses&amp;nbsp;app.config&amp;nbsp;connection&amp;nbsp;string&amp;nbsp;named&amp;nbsp;"NorthwindContext"&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;public&lt;/span&gt;&amp;nbsp;NorthwindContext(&lt;span style="color:#2b91af;"&gt;DbConnection&lt;/span&gt;&amp;nbsp;connection)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&lt;span style="color:blue;"&gt;base&lt;/span&gt;(connection,&lt;span style="color:blue;"&gt;true&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//ctor&amp;nbsp;uses&amp;nbsp;for&amp;nbsp;tracing&amp;nbsp;&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;7.
In my test, you need to use the overload that takes the DbConnection.&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;using&lt;/span&gt;&amp;nbsp;(&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;context&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;NorthwindContext&lt;/span&gt;(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CreateConnectionWrapper(&lt;span style="color:#a31515;"&gt;@"name=NorthwindContext"&lt;/span&gt;)))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//profile&amp;nbsp;this!&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;product&amp;nbsp;=&amp;nbsp;context.ProductCollection.Find(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;8.
And add the CreateConnectionWrapper method:&lt;br&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color:blue;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;DbConnection&lt;/span&gt;&amp;nbsp;CreateConnectionWrapper(&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;nbsp;nameOrConnectionString)
{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;providerInvariantName&amp;nbsp;=&amp;nbsp;&lt;span style="color:#a31515;"&gt;"System.Data.SqlClient"&lt;/span&gt;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;connectionString&amp;nbsp;=&amp;nbsp;nameOrConnectionString;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//name=connectionName&amp;nbsp;format&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;index&amp;nbsp;=&amp;nbsp;nameOrConnectionString.IndexOf(&lt;span style="color:#a31515;"&gt;'='&lt;/span&gt;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(index &amp;gt; 0 &amp;amp;&amp;amp;
nameOrConnectionString.Substring(0,&amp;nbsp;index).Trim() &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Equals(&lt;span style="color:#a31515;"&gt;"name"&lt;/span&gt;,&amp;nbsp;&lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.OrdinalIgnoreCase))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nameOrConnectionString&amp;nbsp;=&amp;nbsp;nameOrConnectionString
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Substring(index&amp;nbsp;+&amp;nbsp;1).Trim();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//look&amp;nbsp;up&amp;nbsp;connection&amp;nbsp;string&amp;nbsp;name&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;connectionStringSetting&amp;nbsp;=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;ConfigurationManager&lt;/span&gt;.ConnectionStrings[nameOrConnectionString];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;if&lt;/span&gt;&amp;nbsp;(connectionStringSetting&amp;nbsp;!=&amp;nbsp;&lt;span style="color:blue;"&gt;null&lt;/span&gt;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;providerInvariantName&amp;nbsp;=&amp;nbsp;connectionStringSetting.ProviderName;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connectionString&amp;nbsp;=&amp;nbsp;connectionStringSetting.ConnectionString;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//create&amp;nbsp;the&amp;nbsp;special&amp;nbsp;connection&amp;nbsp;string&amp;nbsp;with&amp;nbsp;the&amp;nbsp;provider&amp;nbsp;name&amp;nbsp;in&amp;nbsp;it&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;wrappedConnectionString&amp;nbsp;=&amp;nbsp;&lt;span style="color:#a31515;"&gt;"wrappedProvider="&lt;/span&gt;&amp;nbsp;+&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;providerInvariantName&amp;nbsp;+&amp;nbsp;&lt;span style="color:#a31515;"&gt;";"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connectionString; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//create&amp;nbsp;the&amp;nbsp;tracing&amp;nbsp;wrapper&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;var&lt;/span&gt;&amp;nbsp;connection&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;EFTracingConnection&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ConnectionString&amp;nbsp;=&amp;nbsp;wrappedConnectionString
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green;"&gt;//hook&amp;nbsp;up&amp;nbsp;logging&amp;nbsp;here&lt;/span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connection.CommandFinished&amp;nbsp;+=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sender,&amp;nbsp;args)&amp;nbsp;=&amp;gt;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(args.ToTraceString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue;"&gt;return&lt;/span&gt;&amp;nbsp;connection; }&lt;/pre&gt;This
should cope with connection strings in the 3 common forms ("Northwind", "name=Northwind"
and "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind ...")&lt;br&gt;
&lt;br&gt;
Note the line to hook up logging (subscribing to the connection.CommandFinished event).
We could simply have used 
&lt;br&gt;
&lt;pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"&gt;&lt;span style="color:#2b91af;"&gt;EFTracingProviderConfiguration&lt;/span&gt;.LogToConsole&amp;nbsp;=&amp;nbsp;&lt;span style="color:blue;"&gt;true&lt;/span&gt;; 
&lt;br&gt;
&lt;/pre&gt;
&lt;p&gt;
Or you can hook up to log4net or EntLib logging to those tracing events. 
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;pre style="font-family:Consolas;font-size:13;color:black;background:white;"&gt;
&lt;br&gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=ce15092e-2857-450d-b20f-534afedd5d2f" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,ce15092e-2857-450d-b20f-534afedd5d2f.aspx</comments>
      <category>.net 4</category>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
    <item>
      <trackback:ping>http://martinwilley.com/blog/Trackback.aspx?guid=ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b</trackback:ping>
      <pingback:server>http://martinwilley.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://martinwilley.com/blog/PermaLink,guid,ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b.aspx</pingback:target>
      <dc:creator>Martin</dc:creator>
      <wfw:comment>http://martinwilley.com/blog/CommentView,guid,ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b.aspx</wfw:comment>
      <wfw:commentRss>http://martinwilley.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I wanted to use a many-to-many relationship using Entity Framework Code First (v4.1/4.2).
</p>
        <p>
Using pure code first such as this:
</p>
        <pre class="csharpcode">
          <span class="kwrd">using</span> (var context = <span class="kwrd">new</span> MyContext())
{ var employee = <span class="kwrd">new</span> Employee { FirstName = <span class="str">"Homer"</span>,
LastName = <span class="str">"Simpson"</span> }; var territory = <span class="kwrd">new</span> Territory
{ TerritoryDescription = <span class="str">"Springfield"</span> }; employee.Territories.Add(territory);
context.Employees.Add(employee); context.SaveChanges(); }</pre>
        <style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
results in a nice association table
</p>
        <p>
          <a href="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image.png">
            <img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_thumb.png" width="244" height="180" />
          </a>
        </p>
        <p>
How do you map existing database tables? Like Northwind's customer to customer demographic
table relationship:
</p>
        <p>
          <a href="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_3.png">
            <img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_thumb_3.png" width="244" height="213" />
          </a>
        </p>
        <p>
This is the code I want to write:
</p>
        <pre class="csharpcode">
          <span class="kwrd">using</span> (var context = <span class="kwrd">new</span> MyContext(<span class="str">"name=Northwind"</span>))
{ var demo = <span class="kwrd">new</span> CustomerDemographic(); demo.CustomerTypeID
= <span class="str">"BERLIN"</span>; demo.CustomerDesc = <span class="str">"Berliner"</span>;
context.CustomerDemographics.Add(demo); <span class="rem">//link it to a customer
by either end</span> var alfki = context.Customers.Find(<span class="str">"ALFKI"</span>);
alfki.CustomerDemographics.Add(demo); context.SaveChanges(); }</pre>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
We have to override DbContext's OnModelCreating and add some mapping. For CodeFirst,
you map both sides of the relationship, so you can either put the mapping on Customer
or CustomerDemographic - or even both if the mappings agree. A normal foreign key
relationship is mapped with ".HasMany|HasOptional|HasRequired" followed by a ".WithMany|WithOptional|WithRequired". 
</p>
        <p>
So, from the CustomerDemographic entity, a many to many is just .HasMany(x=&gt;x.Customers).WithMany(z=&gt;z.CustomerDemographics).
</p>
        <p>
In addition, we don't have standard names for our association table so we add a .Map
element to specify the table and the left and right key columns. 
</p>
        <p>
Note the primary key of CustomerDemographics isn't the 'tableName'+"Id" convention
that Code First will expect. So I have to define the key for that. As we have that
end of the configuration, we'll define the mapping there.
</p>
        <p>
Here's the code.
</p>
        <pre class="csharpcode">modelBuilder.Entity&lt;CustomerDemographic&gt;()
    <span class="rem">//the
key isn't standard so specify it</span> .HasKey(x =&gt; x.CustomerTypeID) <span class="rem">//define
both sides of the relationship - HasMany.WithMany</span> .HasMany(x =&gt; x.Customers)
.WithMany(z =&gt; z.CustomerDemographics) <span class="rem">//specify mapping information</span> .Map(map
=&gt; { <span class="rem">//the association table name</span> map.ToTable(<span class="str">"CustomerCustomerDemo"</span>); <span class="rem">//the
left side (fk to CustomerDemographic, the entity we're defining)</span> map.MapLeftKey(<span class="str">"CustomerTypeID"</span>); <span class="rem">//the
right side (fk to Customers, the other side)</span> map.MapRightKey(<span class="str">"CustomerID"</span>);
} );</pre>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
If we mapped from the Customer entity, the HasMany and WithMany properties are different,
and the mapped left and right keys swap round.
</p>
        <p>
Here's the full DbContext for my mini-Northwind mapping:
</p>
        <pre class="csharpcode">
          <span class="kwrd">class</span> MyContext : DbContext { <span class="kwrd">public</span> MyContext(<span class="kwrd">string</span> connectionName)
: <span class="kwrd">base</span>(connectionName) { } <span class="kwrd">public</span> DbSet&lt;Employee&gt;
Employees { get; set; } <span class="kwrd">public</span> DbSet&lt;Territory&gt; Territories
{ get; set; } <span class="kwrd">public</span> DbSet&lt;Customer&gt; Customers { get;
set; } <span class="kwrd">public</span> DbSet&lt;CustomerDemographic&gt; CustomerDemographics
{ get; set; } <span class="kwrd">protected</span><span class="kwrd">override</span><span class="kwrd">void</span> OnModelCreating(DbModelBuilder
modelBuilder) { <span class="rem">//Database.SetInitializer(new DropCreateDatabaseIfModelChanges&lt;MyContext&gt;());</span> Database.SetInitializer&lt;MyContext&gt;(<span class="kwrd">null</span>);
modelBuilder.Conventions.Remove&lt;System.Data.Entity.Infrastructure.IncludeMetadataConvention&gt;();
modelBuilder.Entity&lt;CustomerDemographic&gt;() <span class="rem">//the key isn't
standard so specify it</span> .HasKey(x =&gt; x.CustomerTypeID) <span class="rem">//define
both sides of the relationship - HasMany.WithMany</span> .HasMany(x =&gt; x.Customers)
.WithMany(z =&gt; z.CustomerDemographics) <span class="rem">//specify mapping information</span> .Map(map
=&gt; { <span class="rem">//the association table name</span> map.ToTable(<span class="str">"CustomerCustomerDemo"</span>); <span class="rem">//the
left side (fk to CustomerDemographic, the entity we're defining)</span> map.MapLeftKey(<span class="str">"CustomerTypeID"</span>); <span class="rem">//the
right side (fk to Customers, the other side)</span> map.MapRightKey(<span class="str">"CustomerID"</span>);
} ); } }</pre>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b" />
      </body>
      <title>EF Code First Many to Many Mapping</title>
      <guid isPermaLink="false">http://martinwilley.com/blog/PermaLink,guid,ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b.aspx</guid>
      <link>http://martinwilley.com/blog/2012/02/05/EFCodeFirstManyToManyMapping.aspx</link>
      <pubDate>Sun, 05 Feb 2012 20:42:13 GMT</pubDate>
      <description>&lt;p&gt;
I wanted to use a many-to-many relationship using Entity Framework Code First (v4.1/4.2).
&lt;/p&gt;
&lt;p&gt;
Using pure code first such as this:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (var context = &lt;span class="kwrd"&gt;new&lt;/span&gt; MyContext())
{ var employee = &lt;span class="kwrd"&gt;new&lt;/span&gt; Employee { FirstName = &lt;span class="str"&gt;&amp;quot;Homer&amp;quot;&lt;/span&gt;,
LastName = &lt;span class="str"&gt;&amp;quot;Simpson&amp;quot;&lt;/span&gt; }; var territory = &lt;span class="kwrd"&gt;new&lt;/span&gt; Territory
{ TerritoryDescription = &lt;span class="str"&gt;&amp;quot;Springfield&amp;quot;&lt;/span&gt; }; employee.Territories.Add(territory);
context.Employees.Add(employee); context.SaveChanges(); }&lt;/pre&gt;
&lt;style type="text/css"&gt;


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
results in a nice association table
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_thumb.png" width="244" height="180" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
How do you map existing database tables? Like Northwind's customer to customer demographic
table relationship:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.martinwilley.com/blog/content/binary/EF-Code-First-Many-to-Many-Mapping_107AD/image_thumb_3.png" width="244" height="213" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
This is the code I want to write:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (var context = &lt;span class="kwrd"&gt;new&lt;/span&gt; MyContext(&lt;span class="str"&gt;&amp;quot;name=Northwind&amp;quot;&lt;/span&gt;))
{ var demo = &lt;span class="kwrd"&gt;new&lt;/span&gt; CustomerDemographic(); demo.CustomerTypeID
= &lt;span class="str"&gt;&amp;quot;BERLIN&amp;quot;&lt;/span&gt;; demo.CustomerDesc = &lt;span class="str"&gt;&amp;quot;Berliner&amp;quot;&lt;/span&gt;;
context.CustomerDemographics.Add(demo); &lt;span class="rem"&gt;//link it to a customer
by either end&lt;/span&gt; var alfki = context.Customers.Find(&lt;span class="str"&gt;&amp;quot;ALFKI&amp;quot;&lt;/span&gt;);
alfki.CustomerDemographics.Add(demo); context.SaveChanges(); }&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
We have to override DbContext's OnModelCreating and add some mapping. For CodeFirst,
you map both sides of the relationship, so you can either put the mapping on Customer
or CustomerDemographic - or even both if the mappings agree. A normal foreign key
relationship is mapped with ".HasMany|HasOptional|HasRequired" followed by a ".WithMany|WithOptional|WithRequired". 
&lt;/p&gt;
&lt;p&gt;
So, from the CustomerDemographic entity, a many to many is just .HasMany(x=&amp;gt;x.Customers).WithMany(z=&amp;gt;z.CustomerDemographics).
&lt;/p&gt;
&lt;p&gt;
In addition, we don't have standard names for our association table so we add a .Map
element to specify the table and the left and right key columns. 
&lt;/p&gt;
&lt;p&gt;
Note the primary key of CustomerDemographics isn't the 'tableName'+"Id" convention
that Code First will expect. So I have to define the key for that. As we have that
end of the configuration, we'll define the mapping there.
&lt;/p&gt;
&lt;p&gt;
Here's the code.
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;modelBuilder.Entity&amp;lt;CustomerDemographic&amp;gt;()
    &lt;span class="rem"&gt;//the
key isn't standard so specify it&lt;/span&gt; .HasKey(x =&amp;gt; x.CustomerTypeID) &lt;span class="rem"&gt;//define
both sides of the relationship - HasMany.WithMany&lt;/span&gt; .HasMany(x =&amp;gt; x.Customers)
.WithMany(z =&amp;gt; z.CustomerDemographics) &lt;span class="rem"&gt;//specify mapping information&lt;/span&gt; .Map(map
=&amp;gt; { &lt;span class="rem"&gt;//the association table name&lt;/span&gt; map.ToTable(&lt;span class="str"&gt;&amp;quot;CustomerCustomerDemo&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;//the
left side (fk to CustomerDemographic, the entity we're defining)&lt;/span&gt; map.MapLeftKey(&lt;span class="str"&gt;&amp;quot;CustomerTypeID&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;//the
right side (fk to Customers, the other side)&lt;/span&gt; map.MapRightKey(&lt;span class="str"&gt;&amp;quot;CustomerID&amp;quot;&lt;/span&gt;);
} );&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
If we mapped from the Customer entity, the HasMany and WithMany properties are different,
and the mapped left and right keys swap round.
&lt;/p&gt;
&lt;p&gt;
Here's the full DbContext for my mini-Northwind mapping:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; MyContext : DbContext { &lt;span class="kwrd"&gt;public&lt;/span&gt; MyContext(&lt;span class="kwrd"&gt;string&lt;/span&gt; connectionName)
: &lt;span class="kwrd"&gt;base&lt;/span&gt;(connectionName) { } &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Employee&amp;gt;
Employees { get; set; } &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Territory&amp;gt; Territories
{ get; set; } &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Customer&amp;gt; Customers { get;
set; } &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;CustomerDemographic&amp;gt; CustomerDemographics
{ get; set; } &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder
modelBuilder) { &lt;span class="rem"&gt;//Database.SetInitializer(new DropCreateDatabaseIfModelChanges&amp;lt;MyContext&amp;gt;());&lt;/span&gt; Database.SetInitializer&amp;lt;MyContext&amp;gt;(&lt;span class="kwrd"&gt;null&lt;/span&gt;);
modelBuilder.Conventions.Remove&amp;lt;System.Data.Entity.Infrastructure.IncludeMetadataConvention&amp;gt;();
modelBuilder.Entity&amp;lt;CustomerDemographic&amp;gt;() &lt;span class="rem"&gt;//the key isn't
standard so specify it&lt;/span&gt; .HasKey(x =&amp;gt; x.CustomerTypeID) &lt;span class="rem"&gt;//define
both sides of the relationship - HasMany.WithMany&lt;/span&gt; .HasMany(x =&amp;gt; x.Customers)
.WithMany(z =&amp;gt; z.CustomerDemographics) &lt;span class="rem"&gt;//specify mapping information&lt;/span&gt; .Map(map
=&amp;gt; { &lt;span class="rem"&gt;//the association table name&lt;/span&gt; map.ToTable(&lt;span class="str"&gt;&amp;quot;CustomerCustomerDemo&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;//the
left side (fk to CustomerDemographic, the entity we're defining)&lt;/span&gt; map.MapLeftKey(&lt;span class="str"&gt;&amp;quot;CustomerTypeID&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;//the
right side (fk to Customers, the other side)&lt;/span&gt; map.MapRightKey(&lt;span class="str"&gt;&amp;quot;CustomerID&amp;quot;&lt;/span&gt;);
} ); } }&lt;/pre&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;img width="0" height="0" src="http://martinwilley.com/blog/aggbug.ashx?id=ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b" /&gt;</description>
      <comments>http://martinwilley.com/blog/CommentView,guid,ca8c77fc-60bf-4cd1-b6f8-c75ddf6a378b.aspx</comments>
      <category>.net 4</category>
      <category>Code First</category>
      <category>Entity Framework</category>
    </item>
  </channel>
</rss>
