<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Meta-Me</title><link>http://blogs.msdn.com/alexj/default.aspx</link><description /><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Tip 43 – How to authenticate against a Data Service</title><link>http://blogs.msdn.com/alexj/archive/2009/11/13/tip-43-how-to-authenticate-against-a-data-service.aspx</link><pubDate>Fri, 13 Nov 2009 16:33:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9922040</guid><dc:creator>AlexJ</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9922040.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9922040</wfw:commentRss><description>&lt;H3&gt;Problem:&lt;/H3&gt;
&lt;P&gt;When writing code against a Data Service, like say&amp;nbsp;&lt;A href="http://blogs.msdn.com/astoriateam/archive/2009/10/21/using-data-services-over-sharepoint-2010-part-1-getting-started.aspx" mce_href="http://blogs.msdn.com/astoriateam/archive/2009/10/21/using-data-services-over-sharepoint-2010-part-1-getting-started.aspx"&gt;&lt;FONT color=#006ff7&gt;SharePoint&lt;/FONT&gt;&lt;/A&gt;,&amp;nbsp;the&amp;nbsp;client application must provide a valid set of credentials, or you will see a dreaded “401 Unathorized” response.&lt;/P&gt;
&lt;P&gt;For Silverlight applications hosted on the same site as the DataService, this is generally handled for you automatically. &lt;/P&gt;
&lt;P&gt;But WPF applications, for example, need manual intervension.&lt;/P&gt;
&lt;H3&gt;Solution:&lt;/H3&gt;
&lt;P&gt;The solution it to set the Credentials property on&amp;nbsp;your DataServiceContext before you issue any queries or updates, like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;Uri uri = new Uri("&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;http://mflasko-dev/_vti_bin/listdata.svc"&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;)); &lt;BR&gt;TeamSiteDataContext ctx = new TeamSiteDataContext(uri);&lt;BR&gt;ctx.Credentials = System.Net.CredentialCache.DefaultCredentials; &lt;BR&gt;… &lt;BR&gt;&lt;/FONT&gt;&lt;BR&gt;That’s it.&lt;/P&gt;
&lt;P&gt;Done.&lt;/P&gt;
&lt;P&gt;Of course you can get fancy and provide another set of credentials if necessary, but generally the DefaultCredentials is what you want.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9922040" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/Sharepoint/default.aspx">Sharepoint</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Data+Services/default.aspx">Data Services</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Authentication/default.aspx">Authentication</category></item><item><title>Interesting series of Posts exploring Code-Only</title><link>http://blogs.msdn.com/alexj/archive/2009/11/13/interesting-series-of-posts-exploring-code-only.aspx</link><pubDate>Fri, 13 Nov 2009 16:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9922017</guid><dc:creator>AlexJ</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9922017.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9922017</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://daniel.wertheim.se/" mce_href="http://daniel.wertheim.se/"&gt;Daniel Wertheim&lt;/A&gt; left a couple of comments on &lt;A href="http://blogs.msdn.com/alexj/archive/2009/11/09/tip-42-how-to-create-a-dynamic-model-using-code-only.aspx" mce_href="http://blogs.msdn.com/alexj/archive/2009/11/09/tip-42-how-to-create-a-dynamic-model-using-code-only.aspx"&gt;Tip 42&lt;/A&gt;, that point to a &lt;A href="http://daniel.wertheim.se/2009/11/13/entity-framework-4-part-4-autoregister-entitymappings/" mce_href="http://daniel.wertheim.se/2009/11/13/entity-framework-4-part-4-autoregister-entitymappings/"&gt;series of posts&lt;/A&gt; he has written about using &lt;A href="http://blogs.msdn.com/adonet/archive/2009/11/12/updated-feature-ctp-walkthrough-code-only-for-entity-framework.aspx" mce_href="http://blogs.msdn.com/adonet/archive/2009/11/12/updated-feature-ctp-walkthrough-code-only-for-entity-framework.aspx"&gt;Code-Only&lt;/A&gt; to write clean code.&lt;/P&gt;
&lt;P&gt;The series is really interesting as he delves into topics like: facades, relationships between non-public properties, integrating pluralization, using structure map etc. &lt;/P&gt;
&lt;P&gt;All well worth a read, so &lt;A href="http://daniel.wertheim.se/2009/11/13/entity-framework-4-part-4-autoregister-entitymappings/" mce_href="http://daniel.wertheim.se/2009/11/13/entity-framework-4-part-4-autoregister-entitymappings/"&gt;check it out&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Nice job Daniel!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9922017" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/Community/default.aspx">Community</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Code+Only/default.aspx">Code Only</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Finds/default.aspx">Finds</category></item><item><title>Tip 42 – How to create a dynamic model using Code-Only</title><link>http://blogs.msdn.com/alexj/archive/2009/11/09/tip-42-how-to-create-a-dynamic-model-using-code-only.aspx</link><pubDate>Mon, 09 Nov 2009 16:42:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9919610</guid><dc:creator>AlexJ</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9919610.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9919610</wfw:commentRss><description>&lt;H3&gt;Background:&lt;/H3&gt;
&lt;P&gt;When we give examples of how to use &lt;A href="http://blogs.msdn.com/efdesign/archive/2009/10/12/code-only-further-enhancements.aspx" mce_href="http://blogs.msdn.com/efdesign/archive/2009/10/12/code-only-further-enhancements.aspx"&gt;Code-Only&lt;/A&gt; we always start with a strongly typed Context derived from &lt;STRONG&gt;ObjectContext&lt;/STRONG&gt;. This class is used to bootstrap the model. &lt;/P&gt;
&lt;P&gt;For example this (property bodies omitted for simplicity sake):&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public class MyContext : ObjectContext &lt;BR&gt;{&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; public ObjectSet&amp;lt;Category&amp;gt; Categories { get; } &lt;BR&gt;&amp;nbsp;&amp;nbsp; public ObjectSet&amp;lt;Product&amp;gt; Products { get; } &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Tells CodeOnly that to bootstrap a model with 2 EntitySets, a set of &lt;STRONG&gt;Category&lt;/STRONG&gt; entities called &lt;STRONG&gt;Categories&lt;/STRONG&gt;, and a set of &lt;STRONG&gt;Product&lt;/STRONG&gt; entities called &lt;STRONG&gt;Products&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Then if necessary you can further refine the model by manipulating the &lt;STRONG&gt;ContextBuilder&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H3&gt;Problem:&lt;/H3&gt;
&lt;P&gt;But what if you don’t have a strongly typed Context class? &lt;/P&gt;
&lt;P&gt;What if you make a determination at runtime that you need a model,&amp;nbsp;there isn't&amp;nbsp;an appropriate strongly typed Context class lying around.&lt;/P&gt;
&lt;P&gt;A customer asked me this very question earlier today. &lt;/P&gt;
&lt;H3&gt;Solution:&lt;/H3&gt;
&lt;P&gt;It turns out you can use &lt;STRONG&gt;ObjectContext&lt;/STRONG&gt; directly. When you do this though Code-Only knows nothing about the model. But that isn’t that bad all you need to do is explicitly tell Code-Only about all the things it would normally learn from the strongly typed context.&lt;/P&gt;
&lt;P&gt;For example this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public ObjectSet&amp;lt;Person&amp;gt; People { get; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Can be converted into this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;var builder = new ContextBuilder&amp;lt;ObjectContext&amp;gt;(); &lt;BR&gt;builder.RegisterSet&amp;lt;Person&amp;gt;(“People”);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Nifty huh?&lt;/P&gt;
&lt;H3&gt;End to end example:&lt;/H3&gt;
&lt;P&gt;This example, persists a Person (BillG) to the database and retrieves it again, all without a strongly typed &lt;STRONG&gt;ObjectContext&lt;/STRONG&gt;:&lt;/P&gt;
&lt;P&gt;First the Person class (which is POCO):&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public class Person &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int ID { get; set; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Firstname { get; set; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Surname { get; set; } &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;And now the code to setup the ObjectContext: &lt;BR&gt;&lt;FONT face="Courier New"&gt;&lt;BR&gt;// Create the contextbuilder, and tell it about the People set. &lt;BR&gt;var builder = new ContextBuilder&amp;lt;ObjectContext&amp;gt;(); &lt;BR&gt;builder.RegisterSet&amp;lt;Person&amp;gt;("People");&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;// Create a connection &lt;BR&gt;string connstr = @"Data Source=.\SQLEXPRESS;Initial Catalog=PeopleDb;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True"; &lt;BR&gt;var conn = new SqlConnection(connstr); &lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;BR&gt;// Create an ObjectContext from the builder &lt;BR&gt;using (ObjectContext ctx = builder.Create(conn)) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create the database if it doesn’t already exist &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!ctx.DatabaseExists()) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.CreateDatabase(); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create Bill &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Person p = new Person { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID = 1, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Firstname = "Bill", &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Surname = "Gates" &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }; &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Add Bill to the context&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;nbsp;UPDATE: thanks to danny for the simplification&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.CreateObjectSet&amp;lt;Person&amp;gt;().AddObject(p);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&lt;STRIKE&gt;using the general purpose &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // AddObject method. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // The only tricky part is the EntitySet name with must&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // be qualified with the the container name,&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // in this case is ObjectContext. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.AddObject("ObjectContext.People", p);&lt;/STRIKE&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.SaveChanges(); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Issue a query against the People set. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var bill = (from person in ctx.CreateObjectSet&amp;lt;Person&amp;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; where person.Firstname == "Bill" &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; select person).Single(); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Make and Save a change. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bill.Firstname = "William"; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.SaveChanges(); &lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Pretty easy considering it isn’t strongly typed.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9919610" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/EF/default.aspx">EF</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tricks/default.aspx">Tricks</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Code+Only/default.aspx">Code Only</category></item><item><title>Tip 41 – How to execute T-SQL directly against the database</title><link>http://blogs.msdn.com/alexj/archive/2009/11/07/tip-41-how-to-execute-t-sql-directly-against-the-database.aspx</link><pubDate>Sat, 07 Nov 2009 08:27:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9919019</guid><dc:creator>AlexJ</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9919019.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9919019</wfw:commentRss><description>&lt;p&gt;Sometimes you’ll find you need to issue a query or command that the Entity Framework can’t support. In fact this problem is common to most ORMs, which is why so many of them have a backdoor to the database.&lt;/p&gt;  &lt;p&gt;The Entity Framework has a backdoor too…&lt;/p&gt;  &lt;h3&gt;.NET 3.5 SP1&lt;/h3&gt;  &lt;p&gt;In .NET 3.5 SP1 you can get to the underlying database connection through your &lt;strong&gt;ObjectContext&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Calling &lt;strong&gt;ObjectContext.Connection&lt;/strong&gt; returns an &lt;strong&gt;IDbConnection&lt;/strong&gt;, but not the one we need, it is an &lt;strong&gt;EntityConnection.&lt;/strong&gt; However the &lt;strong&gt;EntityConnection&lt;/strong&gt; has a &lt;strong&gt;StoreConnection&lt;/strong&gt; property that does return what we need:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;var entityConn = ctx.Connection as EntityConnection;      &lt;br /&gt;var dbConn = entityConn.StoreConnection as SqlConnection;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Once you have this connection you are free to issue a query or command in the normal ADO.NET way:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;dbConn.Open();      &lt;br /&gt;var cmd = new SqlCommand(&amp;quot;SELECT * FROM PRODUCTS&amp;quot;, dbConn );       &lt;br /&gt;using (var reader = cmd.ExecuteReader())       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; while (reader.Read())       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Product: ID:{0} Name:{1} CategoryID:{2}&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; reader[0].ToString(),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; reader[1].ToString(),       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; reader[2].ToString()       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;}       &lt;br /&gt;dbConn.Close();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Pretty easy huh?&lt;/p&gt;  &lt;h3&gt;.NET 4.0:&lt;/h3&gt;  &lt;p&gt;In .NET 4.0 this is even better. There are 2 new methods hanging directly off &lt;strong&gt;ObjectContext&lt;/strong&gt;. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;ExecuteStoreCommand(..)&lt;/strong&gt; for executing commands &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ExecuteStoreQuery&amp;lt;T&amp;gt;(..)&lt;/strong&gt; for executing queries &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;Using ExecuteStoreQuery&amp;lt;T&amp;gt;(..)&lt;/h4&gt;  &lt;p&gt;If you use &lt;strong&gt;ExecuteStoreQuery&amp;lt;T&amp;gt;(..)&lt;/strong&gt;, the EF will create and populate instances of the T for you. So you can write code like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;foreach(var product in ctx.ExecuteStoreQuery&amp;lt;Product&amp;gt;(sql))      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;Product: ID:{0} Name:{1} CategoryID:{2}&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; product.Id,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; product.Name,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; product.CategoryId&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; );       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;To get this to work the Column names returned by the query must match the property names in the class and the class must have a default constructor. But the class doesn’t even need to be an Entity. &lt;/p&gt;  &lt;p&gt;So for example if you have this class:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;public class ProductView      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int ID { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string Name { get; set; }       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string CategoryName { get; set; }       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;To materialize instances of it you just need to write your SQL such that it has ID, Name and CategoryName columns. &lt;/p&gt;  &lt;p&gt;i.e. Something like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;string SQL = @&amp;quot;SELECT P.ID, P.Name, C.Name AS CategoryName      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; FROM Products P       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; JOIN Categories C       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ON P.CategoryID = C.ID&amp;quot;; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;foreach (var pv in ctx.ExecuteStoreQuery&amp;lt;ProductView&amp;gt;(SQL))      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Console.WriteLine(&amp;quot;{0} {1} {2}&amp;quot;,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pv.ID,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pv.Name,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pv.CategoryName       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; );       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Now of course, this example is for demonstration purposes only, normally the query would be much more complicated, i.e. something that LINQ to Entities can’t handle natively.&lt;/p&gt;  &lt;p&gt;In this particular example you could easily do this using standard LINQ to Entities code, see &lt;a href="http://blogs.msdn.com/alexj/archive/2009/11/07/tip-40-how-to-materialize-presentation-models-via-l2e.aspx"&gt;Tip 40&lt;/a&gt; if you are wondering how.&lt;/p&gt;  &lt;h4&gt;Editing Entities returned from ExecuteStoreQuery&amp;lt;T&amp;gt;(..)&lt;/h4&gt;  &lt;p&gt;If the classes being created are indeed Entities, and you want to edit them, you have to provide a little more information:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;var productToEdit = ctx.ExecuteStoreQuery&amp;lt;Product&amp;gt;(sql,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;quot;Products&amp;quot;,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MergeOption.PreserveChanges       &lt;br /&gt;).Single();       &lt;br /&gt;productToEdit.CategoryId = 6;       &lt;br /&gt;ctx.SaveChanges();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Here the second parameter is the name of the EntitySet that the Product belongs too, and the third parameter tells the EF how to merge these entities with any duplicates that might already be in the ObjectContext. &lt;/p&gt;  &lt;p&gt;If you do this right, calling SaveChanges() will flush the changes made to productToEdit back to the database.&lt;/p&gt;  &lt;h4&gt;Using ExecuteStoreCommand():&lt;/h4&gt;  &lt;p&gt;This one is very simple, you issue some command, for example a batch update method, and you will get back whatever the underlying provider returns, typically the number of rows affected:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;// 10% inflation day!      &lt;br /&gt;ctx.ExecuteStoreCommand(       &lt;br /&gt;&amp;#160; &amp;quot;UPDATE Products SET Price = Price * 1.1&amp;quot;       &lt;br /&gt;);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;It is that simple.&lt;/p&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9919019" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/EF/default.aspx">EF</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.msdn.com/alexj/archive/tags/EF+4.0/default.aspx">EF 4.0</category></item><item><title>Tip 40 – How to materialize presentation models via L2E</title><link>http://blogs.msdn.com/alexj/archive/2009/11/07/tip-40-how-to-materialize-presentation-models-via-l2e.aspx</link><pubDate>Sat, 07 Nov 2009 08:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9919016</guid><dc:creator>AlexJ</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9919016.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9919016</wfw:commentRss><description>&lt;h3&gt;Problem:&lt;/h3&gt;  &lt;p&gt;Imagine that you have these entities&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;public class Product      &lt;br&gt;{       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int ID { get; set; }       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name { get; set; }       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual Category Category { get; set; }       &lt;br&gt;}&lt;/font&gt;&lt;/p&gt; &lt;font face="Courier New"&gt;public class Category    &lt;br&gt;{     &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int ID { get; set; }     &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name { get; set; }     &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual List&amp;lt;Product&amp;gt; Products { get; set; }     &lt;br&gt;}&lt;/font&gt;   &lt;p&gt;But for your UI you want to display the product id, product name and the product’s category’s name. &lt;/p&gt;  &lt;p&gt;You might try passing this query to the presentation layer.&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;var displayData = from product in ctx.Products.Include("Category")     &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;&amp;nbsp;&amp;nbsp; select product;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;But then you are passing more than is required around, and binding the UI tightly to the conceptual model, which is probably a bad idea.&lt;/p&gt;  &lt;p&gt;Your next try might be a query like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;var displayData = from product in ctx.Products     &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;&amp;nbsp;&amp;nbsp; select new {      &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID = product.ID,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = product.Name,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CategoryName = product.Category.Name&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;&amp;nbsp;&amp;nbsp; };&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;But then you’ll quickly discover you can’t pass the anonymous types to another method, at least not without a &lt;a href="http://blogs.msdn.com/alexj/archive/2007/11/22/t-castbyexample-t-object-o-t-example.aspx" mce_href="http://blogs.msdn.com/alexj/archive/2007/11/22/t-castbyexample-t-object-o-t-example.aspx"&gt;nasty hack&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Solution:&amp;nbsp; &lt;/h3&gt;  &lt;p&gt;Most people think LINQ to Entities can only materialize Entities and Anonymous types.&lt;/p&gt;  &lt;p&gt;But in fact it turns out it can materialize any non-generic class that has a default constructor.   &lt;br&gt;    &lt;br&gt;Anyway what this means is you can create a view class like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;public class ProductView      &lt;br&gt;{       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int ID { get; set; }       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name { get; set; }       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string CategoryName { get; set; }       &lt;br&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;And then write this:&lt;/p&gt; &lt;font face="Courier New"&gt;var displayData = from product in ctx.Products   &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;&amp;nbsp;&amp;nbsp; select new ProductView {    &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID = product.ID,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = product.Name,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CategoryName = product.Category.Name&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;&amp;nbsp;&amp;nbsp; };&lt;/font&gt;  &lt;p&gt;And then pass this to your view without any problems at all.&lt;/p&gt;  &lt;p&gt;I only just found out about this myself, I had always assumed this would fail. &lt;/p&gt;  &lt;p&gt;So this was a nice pleasant surprise.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9919016" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/EF/default.aspx">EF</category><category domain="http://blogs.msdn.com/alexj/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.msdn.com/alexj/archive/tags/LINQ+to+Entities/default.aspx">LINQ to Entities</category></item><item><title>Tip 39 – How to set overlapping Relationships – EF 4.0 only</title><link>http://blogs.msdn.com/alexj/archive/2009/11/01/tip-39-how-to-set-overlapping-fks-ef-4-0-only.aspx</link><pubDate>Sun, 01 Nov 2009 18:05:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9915902</guid><dc:creator>AlexJ</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9915902.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9915902</wfw:commentRss><description>&lt;h3&gt;Scenario:&lt;/h3&gt;  &lt;p&gt;In EF 4 we have &lt;a href="http://blogs.msdn.com/efdesign/archive/2009/03/16/foreign-keys-in-the-entity-framework.aspx" mce_href="http://blogs.msdn.com/efdesign/archive/2009/03/16/foreign-keys-in-the-entity-framework.aspx"&gt;FK relationships&lt;/a&gt;, available for the first time in .NET 4.0 Beta 2, so it is now possible to have a model something like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;public class Division      &lt;br&gt;{       &lt;br&gt;&amp;nbsp;&amp;nbsp; public int DivisionID {get;set} // Primary Key       &lt;br&gt;&amp;nbsp;&amp;nbsp; public string Name {get;set;}       &lt;br&gt;&amp;nbsp;&amp;nbsp; public virtual List&amp;lt;Lawyer&amp;gt; Lawyers {get;set;}       &lt;br&gt;&amp;nbsp;&amp;nbsp; public virtual List&amp;lt;Unit&amp;gt; Units {get;set;}       &lt;br&gt;}       &lt;br&gt;public class Lawyer       &lt;br&gt;{       &lt;br&gt;&amp;nbsp;&amp;nbsp; public int LawyerID {get;set;} // Primary Key       &lt;br&gt;&amp;nbsp;&amp;nbsp; public int DivisionID {get;set;} // Primary Key + FK to Division       &lt;br&gt;&amp;nbsp;&amp;nbsp; public string Name {get;set;}       &lt;br&gt;&amp;nbsp;&amp;nbsp; public virtual Division Division {get;set;}       &lt;br&gt;&amp;nbsp;&amp;nbsp; public virtual List&amp;lt;Unit&amp;gt; Units {get;set;}       &lt;br&gt;}       &lt;br&gt;public class ProductTeam       &lt;br&gt;{       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int ProductID {get;set;} // Primary Key       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int? DivisionID {get;set;} // FK to Division &amp;amp; Lawyer       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int? LawyerID {get;set;} // FK to Lawyer       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Name {get;set;}       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual Division Division {get;set;}       &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public virtual Lawyer Lawyer {get;set;}       &lt;br&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Notice that the &lt;b&gt;Lawyer&lt;/b&gt; has a Compound key made up of both the &lt;b&gt;LawyerID&lt;/b&gt; and &lt;b&gt;DivisionID.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;This makes things interesting when you start manipulating the &lt;b&gt;ProductTeam&lt;/b&gt; class, which has both &lt;b&gt;Lawyer&lt;/b&gt; and &lt;b&gt;Division&lt;/b&gt; references and the necessary backing FK properties.&lt;/p&gt;  &lt;p&gt;If you do something like this:    &lt;br&gt;    &lt;br&gt;&lt;font face="Courier New"&gt;var team = (from t in ctx.ProductTeams      &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;&amp;nbsp;&amp;nbsp; where t.Lawyer.Name == “Fred Bloggs”       &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;&amp;nbsp;&amp;nbsp; select t).FirstOrDefault();       &lt;br&gt;team.Lawyer = null;       &lt;br&gt;ctx.SaveChanges();&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;What should this do exactly?&lt;/p&gt;  &lt;p&gt;Does this mean clear &lt;b&gt;team.LawyerID&lt;/b&gt; &amp;amp; &lt;b&gt;team.DivisionID&lt;/b&gt; or just &lt;b&gt;team.LawyerID&lt;/b&gt;? &lt;/p&gt;  &lt;p&gt;From the relational standpoint nulling any FK property is sufficient to make the relationship go away.&lt;/p&gt;  &lt;p&gt;Hmm…&lt;/p&gt;  &lt;p&gt;It can be very hard to workout exactly what the user intended, so rather than introduce some magic rules based on naming conventions etc, the EF uses a consistent rule that you can rely on:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;i&gt;When the users sets a reference relationship to null, the EF nulls every nullable FK property that backs the relationship, whether that FK participates in another relationship or not.&lt;/i&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Problem:&lt;/h3&gt;  &lt;p&gt;So in this case the EF nulls both &lt;b&gt;DivisionID&lt;/b&gt; and &lt;b&gt;LawyerID&lt;/b&gt;, because both back the &lt;b&gt;Lawyer&lt;/b&gt; navigation property.&lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;p&gt;Which means nulling the &lt;b&gt;Lawyer&lt;/b&gt; *also* nulls the &lt;b&gt;Division&lt;/b&gt;. &lt;/p&gt;  &lt;p&gt;Did you really want to do that? &lt;/p&gt;  &lt;p&gt;Maybe maybe not.&lt;/p&gt;  &lt;h3&gt;Solution:&lt;/h3&gt;  &lt;p&gt;If you only wanted to null out the &lt;b&gt;Lawyer&lt;/b&gt;, you have a couple of options:&lt;/p&gt;  &lt;p&gt;Change the model so that the &lt;b&gt;DivisionID&lt;/b&gt; FK isn’t nullable, in this case the EF can only null out the &lt;b&gt;LawyerID&lt;/b&gt;, so the relationship to the &lt;b&gt;Division&lt;/b&gt; would be left intact.&lt;/p&gt;  &lt;p&gt;But a solution that changes the model isn’t always possible, what if the Division really needs to be nullable too?&lt;/p&gt;  &lt;p&gt;The better option is to simply manipulate the relationships through the FK properties directly:&lt;/p&gt; &lt;font face="Courier New"&gt;var team = (from t in ctx.ProductTeams    &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;&amp;nbsp;&amp;nbsp; where t.Lawyer.Name == “Fred Bloggs”     &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;&amp;nbsp;&amp;nbsp; select t).FirstOrDefault();     &lt;br&gt;team.LawyerID = null;     &lt;br&gt;ctx.SaveChanges();&lt;/font&gt;   &lt;p&gt;This leaves the DivisionID &amp;amp; Division untouched, as desired.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9915902" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/EF/default.aspx">EF</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.msdn.com/alexj/archive/tags/FK+Associations/default.aspx">FK Associations</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Foreign+Keys/default.aspx">Foreign Keys</category></item><item><title>Tip 38 – How to use CodeOnly with Astoria</title><link>http://blogs.msdn.com/alexj/archive/2009/10/14/tip-38-how-to-use-codeonly-with-astoria.aspx</link><pubDate>Wed, 14 Oct 2009 20:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9907302</guid><dc:creator>AlexJ</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9907302.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9907302</wfw:commentRss><description>&lt;P&gt;The normal way that you create an ADO.NET Data Services (aka Astoria) Service is by creating a class that derives from &lt;FONT face="Courier New"&gt;DataService&amp;lt;T&amp;gt;.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public class BloggingService : DataService&amp;lt;BloggingEntities&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;And if you want to use Entity Framework under the hood the T you supply must derive from ObjectContext.&lt;/P&gt;
&lt;P&gt;Now this works great most of the time, but not with CodeOnly, and here’s why.&lt;/P&gt;
&lt;P&gt;Under the hood the DataService constructs an instance of the BloggingEntities, and gets the model from it, via its MetadataWorkspace.&lt;/P&gt;
&lt;P&gt;The problem is if you’ve configured the model using &lt;A href="http://bit.ly/2Wsiab" mce_href="http://bit.ly/2Wsiab"&gt;Code-Only&lt;/A&gt;, the only way to construct the BloggingEntities is via the Code-Only ContextBuilder, which Astoria knows nothing about.&lt;/P&gt;
&lt;P&gt;Hmm….&lt;/P&gt;
&lt;P&gt;Thankfully there is a very simple workaround, you simply override CreateDataSource() on DataService&amp;lt;T&amp;gt; like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;protected override BloggingService CreateDataSource() &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Code-Only code goes here: &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var contextBuilder = GetConfiguredContextBuilder(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var connection = GetSqlConnection(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return contextBuilder.Create(connection); &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;As you can see this is pretty simple.&lt;/P&gt;
&lt;H3&gt;Fine Print&lt;/H3&gt;
&lt;P&gt;For performance reasons it is important to avoid the cost of re-configuring the ContextBuilder each time, so the GetConfiguredContextBuilder() method should create and configure the builder only once, and cache the builder for subsequent calls.&lt;/P&gt;
&lt;H3&gt;Caveats&lt;/H3&gt;
&lt;P&gt;This tip will only work on .NET 4.0 Beta 2 and above.&lt;/P&gt;
&lt;P&gt;Code-Only only works on .NET 4.0 and is only available as a separate download. ADO.NET Data Services (aka Astoria) is *going* to ship as part of .NET 4.0, but isn’t in Beta1, so you can’t use CodeOnly with Astoria yet, you have to wait for Astoria to show up in .NET 4.0 in Beta2, and you will probably want to wait for another drop of Code-Only too.&lt;/P&gt;
&lt;P&gt;Which simply means you will have a wait a little while before you can try this tip out.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9907302" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Astoria/default.aspx">Astoria</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Code+Only/default.aspx">Code Only</category></item><item><title>Code-Only best practices</title><link>http://blogs.msdn.com/alexj/archive/2009/10/14/code-only-best-practices.aspx</link><pubDate>Wed, 14 Oct 2009 05:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9906991</guid><dc:creator>AlexJ</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9906991.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9906991</wfw:commentRss><description>&lt;p&gt;There have been &lt;a href="http://blogs.msdn.com/efdesign/archive/tags/CodeOnly/default.aspx" mce_href="http://blogs.msdn.com/efdesign/archive/tags/CodeOnly/default.aspx"&gt;lots of posts&lt;/a&gt; on the EFDesign blog talking about how the features in Code Only have evolved.&lt;/p&gt;  &lt;p&gt;But very little covering what we think will be the best way to write the code.&lt;/p&gt;  &lt;p&gt;You may have seen code like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;var prodConf = builder.Entity&amp;lt;Product&amp;gt;();     &lt;br&gt;productConf.HasKey(p =&amp;gt; p.Id);      &lt;br&gt;productConf.Property(p =&amp;gt; p.Id).IsIdentity();      &lt;br&gt;productConf.Property(p =&amp;gt; p.Name)      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .HasMaxLength(100);      &lt;br&gt;productConf.Relationship(p =&amp;gt; p.Category)      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .FromProperty(c =&amp;gt; c.Products)      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .HasConstraint((p,c) =&amp;gt; p.CategoryId == c.Id);      &lt;br&gt;productConf.MapSingleType(p =&amp;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; new {      &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; Id = p.Id,&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; Nme = p.Name,&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; cid = p.CategoryId      &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; })      &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; .ToTable(“dbo.Products”);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;And thought that this is what we recommend you write.&lt;/p&gt;  &lt;p&gt;Well actually it isn’t. &lt;/p&gt;  &lt;p&gt;I’m not making excuses here, but the problem is that sometimes showing best practices gets in the way of explaining features, its so much easier to just show the feature in isolation.&amp;nbsp; &lt;br&gt;    &lt;br&gt;And there is nothing wrong with that… so long as you go back later and give guidance.&lt;/p&gt;  &lt;p&gt;So here goes:&lt;/p&gt;  &lt;p&gt;The recommended way to do this is to create classes that derive from &lt;font face="Courier New"&gt;EntityConfiguration&amp;lt;TEntity&amp;gt;&lt;/font&gt; and put the configuration logic in the constructor like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;public class ProductConfiguration: EntityConfiguration&amp;lt;Product&amp;gt;     &lt;br&gt;{      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ProductConfiguration()      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HasKey(p =&amp;gt; p.Id);      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property(p =&amp;gt; p.Id).IsIdentity();      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Property(p =&amp;gt; p.Name).HasMaxLength(100);      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Relationship(p =&amp;gt; p.Category)      &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; .FromProperty(c =&amp;gt; c.Products)      &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; .HasConstraint((p,c) =&amp;gt; p.CategoryId == c.Id);      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MapSingleType(p =&amp;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; new {      &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;&amp;nbsp;&amp;nbsp; Id = p.Id,&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;&amp;nbsp;&amp;nbsp; Nme = p.Name,&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;&amp;nbsp;&amp;nbsp; cid = p.CategoryId      &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; .ToTable(“dbo.Products”);      &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }      &lt;br&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Next when you want to use this configuration you simply register it:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;builder.Configurations.Add(new ProductConfiguration());     &lt;br&gt;// &amp;amp; repeat for all types you want to configure      &lt;br&gt;&lt;/font&gt;    &lt;br&gt;This nicely encapsulates the configuration and simplifies the code too.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9906991" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Guidance/default.aspx">Guidance</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Code+Only/default.aspx">Code Only</category></item><item><title>Tip 37 – How to do a Conditional Include</title><link>http://blogs.msdn.com/alexj/archive/2009/10/13/tip-37-how-to-do-a-conditional-include.aspx</link><pubDate>Tue, 13 Oct 2009 05:51:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9906456</guid><dc:creator>AlexJ</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9906456.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9906456</wfw:commentRss><description>&lt;h3&gt;Problem&lt;/h3&gt;  &lt;p&gt;Someone asked &lt;a href="http://stackoverflow.com/questions/1535443"&gt;how to do a Conditional Include&lt;/a&gt; a couple of days ago on StackOverflow. &lt;/p&gt;  &lt;p&gt;They wanted to query for some entity (lets say Movies) and eager load some related items (lets say Reviews) but only if the reviews match some criteria (i.e. Review.Stars == 5). &lt;/p&gt;  &lt;p&gt;Unfortunately though this isn’t strictly supported by EF’s eager loading, i.e. ObjectQuery&amp;lt;Movie&amp;gt;.Include(…) because Include(..) is all or nothing.&lt;/p&gt;  &lt;h3&gt;Solution&lt;/h3&gt;  &lt;p&gt;But there is a workaround.&lt;/p&gt;  &lt;p&gt;Here is an example scenario to make this ‘real’:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;public class Movie     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int ID {get;set;}      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string Name {get;set;}      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string Genre {get;set;}      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public List&amp;lt;Review&amp;gt; Reviews {get;set;}      &lt;br /&gt;}      &lt;br /&gt;      &lt;br /&gt;public class Review      &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int ID {get;set;}      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public int Stars {get;set;}&amp;#160; &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string Summary {get;set;}      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public Movie Movie {get;set;}      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public User User {get;set;}      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Imagine if you want to retrieve all ‘Horror’ movies and all of their 5 star reviews.&lt;/p&gt;  &lt;p&gt;You can do so like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;var dbquery =      &lt;br /&gt;&amp;#160;&amp;#160; from movie in ctx.Movies      &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&amp;#160;&amp;#160; where movie.Genre == “Horror”     &lt;br /&gt;&amp;#160;&amp;#160; select new {      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; movie,&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; reviews = from review in movie.Reviews      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; where review.Stars == 5      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; select review      &lt;br /&gt;&amp;#160;&amp;#160; };&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;var movies = dbquery     &lt;br /&gt;&amp;#160;&amp;#160; .AsEnumerable()      &lt;br /&gt;&amp;#160;&amp;#160; .Select(m =&amp;gt; m.movie);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Now why does this work?&lt;/p&gt;  &lt;p&gt;Well the first query creates a new instance of an anonymous type containing each Horror movie and just it’s 5 star ratings. &lt;/p&gt;  &lt;p&gt;The second query runs in memory using LINQ to Objects thanks to the AsEnumerable() call, and simply ‘unwraps’ the movie from its anonymous type wrapper.&lt;/p&gt;  &lt;p&gt;And interestingly each movie will also have just it’s five star reviews loaded!&lt;/p&gt;  &lt;p&gt;So this code:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;foreach(var movie in movies)     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; foreach(var review in movie.Reviews)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Assert(review.Rating == 5);      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Will pass with no Asserts.&lt;/p&gt;  &lt;p&gt;This works because EF implements something called relationship fix-up. &lt;/p&gt;  &lt;p&gt;Relationship fix-up ensures that related objects are automatically linked when the second entity enters the ObjectContext.&lt;/p&gt;  &lt;p&gt;And because we are loading both the Movie and a filtered list of it’s Reviews, both enter the ObjectContext, and EF makes sure they are automatically linked, which means the matching Reviews are present in the appropriate Movie.Reviews collection.&lt;/p&gt;  &lt;p&gt;i.e. Conditional Include.&lt;/p&gt;  &lt;p&gt;There are number of different twists on this theme:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Issue two separate queries: one for the Movies, one for the Reviews, and let relationship fix-up do the rest.&lt;/li&gt;    &lt;li&gt;Issue a select many type query as &lt;a href="http://stackoverflow.com/questions/1535443/ef-query-with-conditinal-include/1535618"&gt;shown here&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;Sorting relationship - &lt;a href="http://blogs.msdn.com/alexj/archive/2009/02/25/tip-1-sorting-relationships-in-entity-framework.aspx"&gt;see Tip1&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Once you understand how relationship fix-up works you can really use it to your advantage.&lt;/p&gt;  &lt;p&gt;Enjoy.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9906456" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/Tricks/default.aspx">Tricks</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/LINQ+to+Entities/default.aspx">LINQ to Entities</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Eager+Loading/default.aspx">Eager Loading</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Object+Services/default.aspx">Object Services</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Linq+to+Objects/default.aspx">Linq to Objects</category></item><item><title>Tagging File Systems?</title><link>http://blogs.msdn.com/alexj/archive/2009/10/10/tagging-file-systems.aspx</link><pubDate>Sat, 10 Oct 2009 06:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9905686</guid><dc:creator>AlexJ</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9905686.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9905686</wfw:commentRss><description>&lt;p&gt;I had an interesting in passing conversation with someone today about tagging file systems… which reminded me of my own sordid past. &lt;/p&gt;  &lt;p&gt;Before I joined Microsoft, before I was an MVP, before I released Base4, I wrote something called XTend. &lt;/p&gt;  &lt;p&gt;At the time I called it a relational file system, but this was back in 2000, today it’d be a ‘tagging’ file-system.&lt;/p&gt;  &lt;p&gt;I personally find it strange that fully 9 years later, I still can’t find a viable tagging / relational file system.&lt;/p&gt;  &lt;p&gt;See I for one want more than just ‘keyword search’ to help with the ‘&lt;a href="http://www.citeulike.org/user/kaz24/article/635428" mce_href="http://www.citeulike.org/user/kaz24/article/635428"&gt;finding found things&lt;/a&gt;’ problem.&lt;/p&gt;  &lt;p&gt;Anyone else feel the same way?&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9905686" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/Philosophical/default.aspx">Philosophical</category><category domain="http://blogs.msdn.com/alexj/archive/tags/File+Systems/default.aspx">File Systems</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tagging/default.aspx">Tagging</category></item><item><title>Tip 36 – How to Construct by Query</title><link>http://blogs.msdn.com/alexj/archive/2009/09/24/tip-36-how-to-construct-by-query.aspx</link><pubDate>Thu, 24 Sep 2009 04:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9898750</guid><dc:creator>AlexJ</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9898750.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9898750</wfw:commentRss><description>&lt;P&gt;While writing &lt;A href="http://blogs.msdn.com/alexj/archive/2009/03/26/index-of-tips.aspx" mce_href="http://blogs.msdn.com/alexj/archive/2009/03/26/index-of-tips.aspx"&gt;my tips series&lt;/A&gt; and writing EF controllers for MVC I found that I regularly wanted to create and attach a &lt;A href="http://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx" mce_href="http://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx"&gt;stub entity&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Unfortunately it isn’t quite that simple, you have to make sure the entity isn’t already attached first, otherwise you’ll see some nasty exceptions. &lt;BR&gt;&lt;BR&gt;To avoid these exceptions I often found myself having to write code like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;Person assignedTo = FindPersonInStateManager(ctx, p =&amp;gt; p.ID == 5); &lt;BR&gt;if (assignedTo == null) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assignedTo = new Person{ID = 5}; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.AttachTo(“People”, assignedTo);&amp;nbsp; &lt;BR&gt;} &lt;BR&gt;bug.AssignedTo = assignedTo;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;But that code is cumbersome, it pollutes my business logic with a whole heap of EF plumbing, which makes it hard to read and write. &lt;/P&gt;
&lt;P&gt;I found myself wishing I could write code like this instead:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;bug.AssignedTo = ctx.People.GetOrCreateAndAttach(p =&amp;gt; p.ID == 5);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Now there is a lot of plumbing to make this possible, but the core problem is converting something like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;(Person p) =&amp;gt; p.ID == 5;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;which is a predicate or query into something like this&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;() =&amp;gt; new Person {ID = 5};&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;which is a LambdaExpression with a MemberInitExpression body.&lt;/P&gt;
&lt;H3&gt;Query By Example&lt;/H3&gt;
&lt;P&gt;Now those of you familiar with the history of ORMs might remember that in the ‘good old days’ a lot of ‘ORMs’ used a pattern called &lt;A href="http://en.wikipedia.org/wiki/Query_by_Example" mce_href="http://en.wikipedia.org/wiki/Query_by_Example"&gt;Query by Example&lt;/A&gt;:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;Person result = ORM.QueryByExample(new Person {ID = 5});&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;With Query by Example you create an instance of the thing you want back from the database, fill in some fields, and the ORM uses this example object to create a query based on the values that have been set.&lt;/P&gt;
&lt;H3&gt;Construct By Query?&lt;/H3&gt;
&lt;P&gt;I bring this up, because the process of going from a Query to an Instance, looks like the exact opposite of going from an Instance to a Query (aka Query by Example).&lt;/P&gt;
&lt;P&gt;Hence the title of this blog post: ‘Construct by Query’. &lt;/P&gt;
&lt;P&gt;For me this analogy / comparison makes this idea all the more beautiful. &lt;/P&gt;
&lt;P&gt;But hey that’s me!&lt;/P&gt;
&lt;H3&gt;Implementation&lt;/H3&gt;
&lt;P&gt;Anyway… so how do we actually do this:&lt;/P&gt;
&lt;P&gt;Well first the plumbing, we need a method to look for an entity in the ObjectStateManager:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public static IEnumerable&amp;lt;TEntity&amp;gt; Where&amp;lt;TEntity&amp;gt;( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this ObjectStateManager manager, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Func&amp;lt;TEntity, bool&amp;gt; predicate &lt;BR&gt;) where TEntity: class &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return manager.GetObjectStateEntries( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityState.Added | &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityState.Deleted |&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; EntityState.Modified | &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityState.Unchanged &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) &lt;BR&gt;&amp;nbsp;&amp;nbsp; .Where(entry =&amp;gt; !entry.IsRelationship) &lt;BR&gt;&amp;nbsp;&amp;nbsp; .Select(entry =&amp;gt; entry.Entity) &lt;BR&gt;&amp;nbsp;&amp;nbsp; .OfType&amp;lt;TEntity&amp;gt;() &lt;BR&gt;&amp;nbsp;&amp;nbsp; .Where(predicate); &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Then we actually write the GetOrCreateAndAttachStub(…) extension method:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public static TEntity GetOrCreateAndAttachStub&amp;lt;TEntity&amp;gt;( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this ObjectQuery&amp;lt;TEntity&amp;gt; query, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression&amp;lt;Func&amp;lt;TEntity, bool&amp;gt;&amp;gt; expression &lt;BR&gt;) where TEntity : class &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var context = query.Context; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var osm = context.ObjectStateManager; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TEntity entity = osm.Where(expression.Compile()) &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .SingleOrDefault(); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (entity == null) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entity = expression.Create(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.AttachToDefaultSet(entity); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return entity; &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;This looks in the ObjectStateManager for a match. &lt;/P&gt;
&lt;P&gt;If nothing is found it converts the predicate expression into an LambdaExpression with a MemberInitExpression body, which is then compiled and invoked to create an instance of TEntity and attach it.&lt;/P&gt;
&lt;P&gt;I’m not going to go into the AttachToDefaultSet method because I’ve shared the code for that previously in &lt;A href="http://blogs.msdn.com/alexj/archive/2009/04/15/tip-13-how-to-attach-an-entity-the-easy-way.aspx" mce_href="http://blogs.msdn.com/alexj/archive/2009/04/15/tip-13-how-to-attach-an-entity-the-easy-way.aspx"&gt;Tip 13&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;So lets skip that and get right to… &lt;/P&gt;
&lt;H4&gt;The guts of the problem&lt;/H4&gt;
&lt;P&gt;The Create extension method, looks like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public static T Create&amp;lt;T&amp;gt;( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; predicateExpr) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var initializerExpression = PredicateToConstructorVisitor &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;&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; .Convert&amp;lt;T&amp;gt;(predicateExpr); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var initializerFunction = initializerExpression.Compile(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return initializerFunction(); &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Where PredicateToConstructorVisitor is a specialized &lt;A href="http://msdn.microsoft.com/en-us/library/bb882521.aspx" mce_href="http://msdn.microsoft.com/en-us/library/bb882521.aspx"&gt;ExpressionVisitor&lt;/A&gt; that just converts from a predicate expression to an MemberInitExpression. &lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public class PredicateToConstructorVisitor &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt; Convert&amp;lt;T&amp;gt;( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; predicate) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PredicateToConstructorVisitor visitor =&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; new PredicateToConstructorVisitor(); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return visitor.Visit&amp;lt;T&amp;gt;(predicate); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt; Visit&amp;lt;T&amp;gt;( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression&amp;lt;Func&amp;lt;T, bool&amp;gt;&amp;gt; predicate) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return VisitLambda(predicate as LambdaExpression)&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; as Expression&amp;lt;Func&amp;lt;T&amp;gt;&amp;gt;; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected virtual Expression VisitLambda( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LambdaExpression lambda) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (lambda.Body is BinaryExpression) &lt;BR&gt;&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; // Create a new instance expression i.e. &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; NewExpression newExpr = &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; Expression.New(lambda.Parameters.Single().Type); &lt;BR&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; BinaryExpression binary =&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; lambda.Body as BinaryExpression; &lt;BR&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; return Expression.Lambda( &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression.MemberInit( &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newExpr, &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMemberAssignments(binary).ToArray() &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;&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;BR&gt;&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; throw new InvalidOperationException( &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; string.Format( &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; "OnlyBinary Expressions are supported.\n\n{0}", &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; lambda.Body.ToString() &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; ) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected IEnumerable&amp;lt;MemberAssignment&amp;gt; GetMemberAssignments( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BinaryExpression binary) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (binary.NodeType == ExpressionType.Equal) &lt;BR&gt;&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; yield return GetMemberAssignment(binary); &lt;BR&gt;&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; else if (binary.NodeType == ExpressionType.AndAlso) &lt;BR&gt;&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; foreach (var assignment in&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; GetMemberAssignments(binary.Left as BinaryExpression).Concat(GetMemberAssignments(binary.Right as BinaryExpression))) &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; { &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; yield return assignment; &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; } &lt;BR&gt;&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; else &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; throw new NotSupportedException(binary.ToString()); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected MemberAssignment GetMemberAssignment( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BinaryExpression binary) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (binary.NodeType != ExpressionType.Equal) &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; throw new InvalidOperationException( &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; binary.ToString() &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; ); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MemberExpression member = binary.Left as MemberExpression; &lt;BR&gt;&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; ConstantExpression constant &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = GetConstantExpression(binary.Right); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (constant.Value == null) &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; constant = Expression.Constant(null, member.Type); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Expression.Bind(member.Member, constant); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected ConstantExpression GetConstantExpression( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression expr) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (expr.NodeType == ExpressionType.Constant) &lt;BR&gt;&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; return expr as ConstantExpression; &lt;BR&gt;&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; else &lt;BR&gt;&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; Type type = expr.Type; &lt;BR&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; if (type.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; { &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; expr = Expression.Convert(expr, typeof(object)); &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; } &lt;BR&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; Expression&amp;lt;Func&amp;lt;object&amp;gt;&amp;gt; lambda &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; = Expression.Lambda&amp;lt;Func&amp;lt;object&amp;gt;&amp;gt;(expr); &lt;BR&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; Func&amp;lt;object&amp;gt; fn = lambda.Compile(); &lt;BR&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; return Expression.Constant(fn(), type); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;/SPAN&gt;
&lt;P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The real work is done in VisitLambda.&lt;/P&gt;
&lt;P&gt;Basically it throws if:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The LambdaExpression isn’t a BinaryExpression.&lt;/LI&gt;
&lt;LI&gt;There is more than one parameter to the LambdaExpression. We can only construct one thing!&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Then we go about the job of walking the BinaryExpression until we get to Equal nodes i.e. (p.ID == 5) which we convert to MemberAssignments (ID = 5) so we can construct a MemberInitExpression. &lt;/P&gt;
&lt;P&gt;When creating the MemberAssignments we convert all Right hand-sides to constants too. i.e. so if the lambda looks like this:&lt;/P&gt;
&lt;P&gt;(Person p) =&amp;gt; p.ID == GetID();&lt;/P&gt;
&lt;P&gt;we evaluate GetID(), so we can use the result in our MemberAssignment.&lt;/P&gt;
&lt;H3&gt;Summary&lt;/H3&gt;
&lt;P&gt;Again I’ve demonstrated that mixing EF Metadata and CLR Expressions makes it possible to write really useful helper methods that take a lot of the pain out writing your apps.&lt;/P&gt;
&lt;P&gt;Enjoy… &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9898750" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/EF/default.aspx">EF</category><category domain="http://blogs.msdn.com/alexj/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tricks/default.aspx">Tricks</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Expressions/default.aspx">Expressions</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/EF+Internals/default.aspx">EF Internals</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Lambda/default.aspx">Lambda</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Extension+Methods/default.aspx">Extension Methods</category></item><item><title>Tip 35 – How to write OfTypeOnly&lt;TEntity&gt;()</title><link>http://blogs.msdn.com/alexj/archive/2009/09/17/tip-35-how-to-write-oftypeonly-tentity.aspx</link><pubDate>Thu, 17 Sep 2009 09:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9896188</guid><dc:creator>AlexJ</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9896188.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9896188</wfw:commentRss><description>&lt;P&gt;If you write a LINQ to Entities query like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;var results = from c in ctx.Vehicles.OfType&amp;lt;Car&amp;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; select c;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;It will bring back, Cars and any type that derives from Car, like say SportCar or SUV.&lt;/P&gt;
&lt;P&gt;If you just want Cars and you don’t want derived types like SportCars or SUVs in LINQ to Objects you would write something like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;var results = from c in vehiclesCollection &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; where c.GetType() == typeof(Car) &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; select c;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;But unfortunately LINQ to Entities doesn’t know how to translate this.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;&lt;STRONG&gt;&lt;U&gt;NOTE:&lt;/U&gt;&lt;/STRONG&gt; &lt;BR&gt;In Entity SQL this is actually pretty easy. The &lt;/FONT&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/bb399295.aspx" mce_href="http://msdn.microsoft.com/en-us/library/bb399295.aspx"&gt;&lt;FONT color=#808080&gt;OFTYPE(collection, [ONLY] type)&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#808080&gt; function will exclude derived types if you include the optional ONLY keyword.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;For example this Entity SQL:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080 face="Courier New"&gt;SELECT VALUE(C) &lt;BR&gt;FROM Container.Vehicles AS C &lt;BR&gt;WHERE C IS OF(ONLY Model.Car)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;will only return Cars: entities derived from Car, like say SUVs, will be filtered out.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Now about six months back, in &lt;A href="http://blogs.msdn.com/alexj/archive/2009/03/20/tip5-restricting-types-returned-from-an-ef-query.aspx" mce_href="http://blogs.msdn.com/alexj/archive/2009/03/20/tip5-restricting-types-returned-from-an-ef-query.aspx"&gt;Tip 5&lt;/A&gt;, I showed you a work-around. You basically had to write something like this:&lt;/P&gt;&lt;FONT face="Courier New"&gt;var results = from c in ctx.Vehicles.OfType&amp;lt;Car&amp;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; where !(c is SUV) &amp;amp;&amp;amp; !(c is SportsCar) &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; select c;&lt;/FONT&gt; 
&lt;P&gt;But this solutions is cumbersome and error prone, so I decided I wanted a better solution.&lt;/P&gt;
&lt;P&gt;You should be able to write something like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;var results = from c in ctx.Vehicles.OfTypeOnly&amp;lt;Car&amp;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; select c;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Now under the hood this method has to:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Take the source ObjectQuery and call OfType&amp;lt;Car&amp;gt;() to get an ObjectQuery&amp;lt;Car&amp;gt;()&lt;/LI&gt;
&lt;LI&gt;Figure out which EntityTypes derive from Car&lt;/LI&gt;
&lt;LI&gt;Construct an LambdaExpression to exclude each of those Derived types from the result.&lt;/LI&gt;
&lt;LI&gt;Take the ObjectQuery&amp;lt;Car&amp;gt; and call Where(Expression&amp;lt;Func&amp;lt;Car,bool&amp;gt;&amp;gt;) on it using the LamdaExpression&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;So lets look at what the code looks like.&lt;/P&gt;
&lt;P&gt;This is the function that pulls everything together:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public static IQueryable&amp;lt;TEntity&amp;gt; OfTypeOnly&amp;lt;TEntity&amp;gt;( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this ObjectQuery query) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; query.CheckArgumentNotNull("query"); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get the C-Space EntityType &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var queryable = query as IQueryable; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var wkspace = query.Context.MetadataWorkspace; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var elementType = typeof(TEntity); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Filter to limit to the DerivedType of interest &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IQueryable&amp;lt;TEntity&amp;gt; filter = query.OfType&amp;lt;TEntity&amp;gt;(); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // See if there are any derived types of TEntity &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityType cspaceEntityType = &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wkspace.GetCSpaceEntityType(elementType); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (cspaceEntityType == null) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new NotSupportedException("Unable to find C-Space type"); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityType[] subTypes = wkspace.GetImmediateDescendants(cspaceEntityType).ToArray(); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (subTypes.Length == 0) return filter; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Get the CLRTypes. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type[] clrTypes = subTypes &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(st =&amp;gt; wkspace.GetClrTypeName(st)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(tn =&amp;gt; elementType.Assembly.GetType(tn))&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToArray(); &lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Need to build the !(a is type1) &amp;amp;&amp;amp; !(a is type2) predicate and call it &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // via the provider &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var lambda = GetIsNotOfTypePredicate(elementType, clrTypes); &lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return filter.Where( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lambda as Expression&amp;lt;Func&amp;lt;TEntity, bool&amp;gt;&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ); &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;As you can see we are using an extension method on MetadataWorkspace called GetCSpaceEntityType() that takes a CLR type and returns the corresponding EntityType.&lt;/P&gt;
&lt;P&gt;It&amp;nbsp;looks like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public static EntityType GetCSpaceEntityType( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this MetadataWorkspace workspace, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type type) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; workspace.CheckArgumentNotNull("workspace"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Make sure the metadata for this assembly is loaded. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; workspace.LoadFromAssembly(type.Assembly); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Try to get the ospace type and if that is found &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // look for the cspace type too. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityType ospaceEntityType = null; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StructuralType cspaceEntityType = null; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (workspace.TryGetItem&amp;lt;EntityType&amp;gt;( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type.FullName, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DataSpace.OSpace, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out ospaceEntityType)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (workspace.TryGetEdmSpaceType( &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; ospaceEntityType, &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; out cspaceEntityType)) &lt;BR&gt;&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; return cspaceEntityType as EntityType; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return null; &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;If this method looks familiars, it is, I introduced it in &lt;A href="http://blogs.msdn.com/alexj/archive/2009/04/15/tip-13-how-to-attach-an-entity-the-easy-way.aspx" mce_href="http://blogs.msdn.com/alexj/archive/2009/04/15/tip-13-how-to-attach-an-entity-the-easy-way.aspx"&gt;Tip 13&lt;/A&gt;. In fact this method is a very handy for your EF toolbox. &lt;BR&gt;&lt;BR&gt;Once we have the EntityType we can look for derived EntityTypes, which is where the GetImmediateDescendants() method comes in. It looks like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public static IEnumerable&amp;lt;EntityType&amp;gt; GetImmediateDescendants( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this MetadataWorkspace workspace, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityType entityType) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var dtype in workspace &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;&amp;nbsp; .GetItemCollection(DataSpace.CSpace) &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;&amp;nbsp; .GetItems&amp;lt;EntityType&amp;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;&amp;nbsp; .Where(e =&amp;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.BaseType != null &amp;amp;&amp;amp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.BaseType.FullName == entityType.FullName)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yield return dtype; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;&lt;STRONG&gt;&lt;U&gt;NOTE:&lt;/U&gt;&lt;/STRONG&gt; I’m only interested in immediate descendants because when the immediate descendants are filtered out, their descendants will also get filtered out.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Next we need to get the CLR types for each of those EntityTypes. To do this I have a function that uses the EF metadata to find the CLR typename for each EntityType, which looks like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public static string GetClrTypeName( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this MetadataWorkspace workspace, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EntityType cspaceEntityType) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StructuralType ospaceEntityType = null; &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (workspace.TryGetObjectSpaceType( &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; cspaceEntityType, out ospaceEntityType)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ospaceEntityType.FullName; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new Exception("Couldn’t find CLR type"); &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;You can then compose this method with some code to get the CLR type for a particular typename. &lt;/P&gt;
&lt;P&gt;Now writing something fool proof can get complicated, but in my case I’m just assuming all the Types are in the same assembly as TEntity. Which makes things very easy:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;// Get the CLRTypes. &lt;BR&gt;Type[] clrTypes = subTypes &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(st =&amp;gt; wkspace.GetClrTypeName(st)) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(tn =&amp;gt; elementType.Assembly.GetType(tn))&lt;/FONT&gt;&lt;FONT face="Courier New"&gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ToArray();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;… and I’m pretty sure you can figure out how to make this a little more robust if necessary :)&lt;/P&gt;
&lt;P&gt;At this point we leave the EF metadata APIs behind and move over to the Expression APIs, &lt;/P&gt;
&lt;P&gt;Gulp! &lt;/P&gt;
&lt;P&gt;Actually its a lot easier that I thought it was going to be.&lt;/P&gt;
&lt;P&gt;We just need a lambda expression that will filter out all the derived CLR types. The equivalent of this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;(TEntity entity) =&amp;gt; !(entity is TSubType1) &amp;amp;&amp;amp; !(entity is TSubType2) &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;So I added this method, the first parameter is the type of the lambda parameter, and then you pass is all the types you want to exclude:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public static LambdaExpression GetIsNotOfTypePredicate( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type parameterType,&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; params Type[] clrTypes) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ParameterExpression predicateParam = &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; Expression.Parameter(parameterType, "parameter"); &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Expression.Lambda( &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; predicateParam.IsNot(clrTypes), &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; predicateParam &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ); &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;As you can see this creates a parameter, and then calls another extension method to create the AndAlso expression needed:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public static Expression IsNot( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this ParameterExpression parameter,&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; params Type[] types) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; types.CheckArgumentNotNull("types"); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; types.CheckArrayNotEmpty("types"); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Expression merged = parameter.IsNot(types[0]); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i = 1; i &amp;lt; types.Length; i++) &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; merged = Expression.AndAlso(merged, &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; parameter.IsNot(types[i])); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return merged; &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public static Expression IsNot( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this ParameterExpression parameter, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type type) &lt;BR&gt;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; type.CheckArgumentNotNull("type"); &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var parameterIs = Expression.TypeIs(parameter, type); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var parameterIsNot = Expression.Not(parameterIs); &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return parameterIsNot; &lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;As you can see the first overload loops over the types and creates an IsNot expression (by calling the second overload) and merges it with the previously created expression, by creating an AndAlso expression. &lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;&lt;STRONG&gt;&lt;U&gt;NOTE:&lt;/U&gt;&lt;/STRONG&gt; You may have noticed that this code is going to produce a deep AndAlso graph. I think this is probably fine, but if you have a particularly wide type hierarchy you might want to look at rewriting this query to balance the graph.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;So by now we have a way to create a LambdaExpression that does the necessary filtering, all we need is cast it to Expression&amp;lt;Func&amp;lt;TEntity, bool&amp;gt;&amp;gt; and pass it to the Where(..) extension method, like this:&lt;/P&gt;&lt;FONT face="Courier New"&gt;var lambda = GetIsNotOfTypePredicate(elementType, clrTypes); &lt;BR&gt;&lt;/FONT&gt;&lt;FONT face="Courier New"&gt;return filter.Where( &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lambda as Expression&amp;lt;Func&amp;lt;TEntity, bool&amp;gt;&amp;gt; &lt;BR&gt;);&lt;/FONT&gt; 
&lt;P&gt;And we’re done!&lt;/P&gt;
&lt;P&gt;Now I’m the first to admit this isn’t exactly ‘easy peasy lemon squeezy’, but I enjoyed developing this solution, it forced me to learn a little more about Expressions and EF metadata APIs.&lt;/P&gt;
&lt;P&gt;Hopefully you’ve found it interesting too.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9896188" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/alexj/attachment/9896188.ashx" length="5668" type="text/plain" /><category domain="http://blogs.msdn.com/alexj/archive/tags/EF/default.aspx">EF</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Expressions/default.aspx">Expressions</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Entity+SQL/default.aspx">Entity SQL</category><category domain="http://blogs.msdn.com/alexj/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/LINQ+to+Entities/default.aspx">LINQ to Entities</category><category domain="http://blogs.msdn.com/alexj/archive/tags/EF+Internals/default.aspx">EF Internals</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Linq+to+Objects/default.aspx">Linq to Objects</category></item><item><title>Tip 34 – How to work with Updatable Views</title><link>http://blogs.msdn.com/alexj/archive/2009/09/01/tip-34-how-to-work-with-updatable-views.aspx</link><pubDate>Tue, 01 Sep 2009 23:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9890065</guid><dc:creator>AlexJ</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9890065.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9890065</wfw:commentRss><description>&lt;p&gt;&lt;font color="#808080"&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; thanks &lt;/font&gt;&lt;a href="http://weblogs.asp.net/zeeshanhirani/" mce_href="http://weblogs.asp.net/zeeshanhirani/"&gt;&lt;font color="#808080"&gt;Zeeshan&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; for pointing out that by default only non-nullable columns end up in the key for view backed entities.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Imagine this situation, you have a view in your database, and it is updatable.&lt;/p&gt;  &lt;p&gt;Next you decide to use this view with the Entity Framework, so you go ahead and import it.&lt;/p&gt;  &lt;p&gt;The resulting entity will look something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/Model.jpg" mce_href="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/Model.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Model" border="0" alt="Model" src="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/Model_thumb.jpg" width="172" height="199" mce_src="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/Model_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As you can see every property icon has a ‘key’ overlay. &lt;/p&gt;  &lt;p&gt;Because the entity is based on a view, the EF doesn’t know which columns make up the primary key, so it assumes &lt;u&gt;every non nullable&lt;/u&gt; column is part of the primary key.&lt;/p&gt;  &lt;h3&gt;Fixing the Key&lt;/h3&gt;  &lt;p&gt;The first step is to change the key. In this case the &lt;font face="Courier New"&gt;ID&lt;/font&gt; is really the key.&lt;/p&gt;  &lt;p&gt;You can do this by opening the EDMX in the XML editor and changing the &lt;font face="Courier New"&gt;EntityType&lt;/font&gt; so that rather than looking like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKey.jpg" mce_href="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKey.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="EntityKey" border="0" alt="EntityKey" src="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKey_thumb.jpg" width="399" height="228" mce_src="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKey_thumb.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Where every property is referenced in the &amp;lt;Key&amp;gt;, change it to this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKeyUpdated.jpg" mce_href="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKeyUpdated.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="EntityKeyUpdated" border="0" alt="EntityKeyUpdated" src="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKeyUpdated_thumb.jpg" width="360" height="172" mce_src="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip34HowtoworkwithUpdatableViews_85E9/EntityKeyUpdated_thumb.jpg" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;It is important to note that you have to make this change in both the &lt;font face="Courier New"&gt;&amp;lt;edmx:StorageModels&amp;gt;&lt;/font&gt; and the &lt;font face="Courier New"&gt;&amp;lt;edmx:ConceptualModels&amp;gt;&lt;/font&gt; sections of the EDMX, because both models must agree about the shape of the primary key.&lt;/p&gt;  &lt;h3&gt;Treat the view as a table&lt;/h3&gt;  &lt;p&gt;At this point you can happily query for Employees use the Entity Framework.&lt;/p&gt;  &lt;p&gt;But the Entity Framework won’t allow you to do updates.&lt;/p&gt;  &lt;p&gt;The normal way around this is to create stored procedures and use them as modification functions.&lt;/p&gt;  &lt;p&gt;But given that the view is already updatable that is obviously not ideal.&lt;/p&gt;  &lt;p&gt;Luckily there is a workaround: Simply convince the EF that the view is a &lt;u&gt;table&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;To do this you have to change the definition of the &lt;font face="Courier New"&gt;EntitySet&lt;/font&gt; in the &lt;font face="Courier New"&gt;StorageModel. &lt;/font&gt;Generally it will start off looking like this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;EntitySet Name=&amp;quot;Employees&amp;quot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;font face="Courier New"&gt;EntityType=&amp;quot;Tip34Model.Store.Employees&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; store:Type=&amp;quot;Views&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; store:Schema=&amp;quot;dbo&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; store:Name=&amp;quot;Employees&amp;quot;&amp;gt;       &lt;br /&gt;&amp;#160; &amp;lt;DefiningQuery&amp;gt;SELECT       &lt;br /&gt;&amp;#160; [Employees].[ID] AS [ID],       &lt;br /&gt;&amp;#160; [Employees].[Firstname] AS [Firstname],       &lt;br /&gt;&amp;#160; [Employees].[Surname] AS [Surname],       &lt;br /&gt;&amp;#160; [Employees].[Email] AS [Email]       &lt;br /&gt;&amp;#160; FROM [dbo].[Employees] AS [Employees]       &lt;br /&gt;&amp;#160; &amp;lt;/DefiningQuery&amp;gt;       &lt;br /&gt;&amp;lt;/EntitySet&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p mce_keep="true"&gt;In order to treat it as a table replace that with this:&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;EntitySet Name=&amp;quot;Employees&amp;quot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; EntityType=&amp;quot;Tip34Model.Store.Employees&amp;quot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; store:Type=&amp;quot;Tables&amp;quot;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Schema=&amp;quot;dbo&amp;quot; /&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Now you can perform every &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" mce_href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;CRUD&lt;/a&gt; operation.&lt;/p&gt;  &lt;p&gt;Pretty easy if you ask me.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9890065" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/EF/default.aspx">EF</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tricks/default.aspx">Tricks</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category></item><item><title>Tip 33 – How cascade delete really works in EF</title><link>http://blogs.msdn.com/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx</link><pubDate>Wed, 19 Aug 2009 03:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9874808</guid><dc:creator>AlexJ</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9874808.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9874808</wfw:commentRss><description>&lt;p&gt;Imagine that in your database you have a cascade delete on an FK relationship. &lt;/p&gt;  &lt;p&gt;Something like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip33Howcascadedeletereallyworks_B8FA/CascadeDeleteInDatabase_1.jpg" mce_href="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip33Howcascadedeletereallyworks_B8FA/CascadeDeleteInDatabase_1.jpg"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip33Howcascadedeletereallyworks_B8FA/CascadeDeleteInDatabase_thumb_1.jpg" style="border: 0px none ; display: inline;" title="CascadeDeleteInDatabase" alt="CascadeDeleteInDatabase" mce_src="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip33Howcascadedeletereallyworks_B8FA/CascadeDeleteInDatabase_thumb_1.jpg" width="244" border="0" height="156"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Here the Delete Rule says that when a &lt;font face="Courier New"&gt;Category&lt;/font&gt; is deleted all the related &lt;font face="Courier New"&gt;Products&lt;/font&gt; should be deleted too.&lt;/p&gt;  &lt;p&gt;If you generate an EF model from this database you get a model that on the surface looks no different from normal:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip33Howcascadedeletereallyworks_B8FA/ProductCategory.jpg" mce_href="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip33Howcascadedeletereallyworks_B8FA/ProductCategory.jpg"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip33Howcascadedeletereallyworks_B8FA/ProductCategory_thumb.jpg" style="border: 0px none ; display: inline;" title="ProductCategory" alt="ProductCategory" mce_src="http://blogs.msdn.com/blogfiles/alexj/WindowsLiveWriter/Tip33Howcascadedeletereallyworks_B8FA/ProductCategory_thumb.jpg" width="244" border="0" height="119"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;But if you dig into the CSDL section of the XML you will see this:&lt;/p&gt;  &lt;p style="line-height: normal; margin-bottom: 0pt;" class="MsoNormal"&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;Association&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: red; font-size: 9pt;"&gt;Name&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;=&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 9pt;"&gt;"&lt;span style="color: blue;"&gt;FK_Products_Categories&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;End&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: red; font-size: 9pt;"&gt;Role&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;=&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 9pt;"&gt;"&lt;span style="color: blue;"&gt;Categories&lt;/span&gt;"&lt;span style="color: blue;"&gt; &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;TipsModel.Store.Categories&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;Multiplicity&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;1&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;OnDelete&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: red; font-size: 9pt;"&gt;Action&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;=&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 9pt;"&gt;"&lt;span style="color: blue;"&gt;Cascade&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;End&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&amp;gt;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;End&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: red; font-size: 9pt;"&gt;Role&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;=&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 9pt;"&gt;"&lt;span style="color: blue;"&gt;Products&lt;/span&gt;"&lt;span style="color: blue;"&gt; &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;TipsModel.Store.Products&lt;/span&gt;"&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;span style="color: red;"&gt;Multiplicity&lt;/span&gt;&lt;span style="color: blue;"&gt;=&lt;/span&gt;"&lt;span style="color: blue;"&gt;*&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;ReferentialConstraint&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&amp;gt;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&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=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;Principal&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: red; font-size: 9pt;"&gt;Role&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;=&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 9pt;"&gt;"&lt;span style="color: blue;"&gt;Categories&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&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&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;PropertyRef&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: red; font-size: 9pt;"&gt;Name&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;=&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 9pt;"&gt;"&lt;span style="color: blue;"&gt;ID&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&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=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;Principal&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&amp;gt;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&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=""&gt;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;Dependent&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: red; font-size: 9pt;"&gt;Role&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;=&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 9pt;"&gt;"&lt;span style="color: blue;"&gt;Products&lt;/span&gt;"&lt;span style="color: blue;"&gt;&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&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&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;PropertyRef&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt; &lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: red; font-size: 9pt;"&gt;Name&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;=&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 9pt;"&gt;"&lt;span style="color: blue;"&gt;CategoryID&lt;/span&gt;"&lt;span style="color: blue;"&gt; /&amp;gt;       &lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=""&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&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;Dependent&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&amp;gt;     &lt;br&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&lt;span style=""&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;ReferentialConstraint&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&amp;gt;     &lt;br&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;Association&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-size: 8pt;"&gt;     &lt;p&gt;&amp;nbsp;&lt;/p&gt;   &lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Notice the &lt;span style="font-family: 'Courier New'; color: blue; font-size: 9pt;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: rgb(163, 21, 21); font-size: 9pt;"&gt;OnDelete&lt;span style="color: blue;"&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;element, this tells the EF that when a &lt;font face="Courier New"&gt;Category&lt;/font&gt; is deleted the related &lt;font face="Courier New"&gt;Products&lt;/font&gt; *will* be too.&lt;/p&gt;  &lt;p&gt;I deliberately said *will* and rather than *should*, because the EF does not take responsibility for cascading the delete in the database.&lt;/p&gt;  &lt;p&gt;The EF is responsible for the correctness of the &lt;font face="Courier New"&gt;ObjectContext&lt;/font&gt; after &lt;font face="Courier New"&gt;SaveChanges()&lt;/font&gt;. So the EF attempts to synchronize the &lt;font face="Courier New"&gt;ObjectContext&lt;/font&gt;, with the expected database state after the expected cascade in the database.&lt;/p&gt;  &lt;p&gt;A tell tale sign of this is that if you open up something like SqlProfiler, you will notice the EF issuing DELETE requests for dependent entities that it knows about (i.e. that are loaded in the &lt;font face="Courier New"&gt;ObjectContext&lt;/font&gt;) when a principal is deleted.&lt;/p&gt;  &lt;p&gt;Essentially what is happening here is that the Entity Framework expects that deleting the principal in the database, will delete all it’s dependents in the database. So it issues, what should be, a redundant DELETE to request itself so the dependents already loaded are deleted from the &lt;font face="Courier New"&gt;ObjectContext&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;The key thing to note is that the EF *does not* retrieve all the dependent entities and issue deletes for them: It only deletes dependents that are already in memory. &lt;br&gt;&lt;/p&gt;  &lt;p&gt;So here are the golden rules:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;If you add an Cascade delete rule to the model, you MUST have a corresponding DELETE rule in the database.&lt;/li&gt;    &lt;li&gt;If you absolutely insist on breaking rule (1) for some reason, Cascade will only work if you have all the dependents loaded in memory&lt;font face="Courier New"&gt;&lt;/font&gt;.&lt;/li&gt;    &lt;li&gt;(2) is *not* recommended!!!&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;While we do our best to keep the &lt;font face="Courier New"&gt;ObjectContext&lt;/font&gt; and database in sync, our attempts can fail if you have multiple levels of cascade delete.     &lt;br&gt;    &lt;br&gt;For example, if you have this:    &lt;br&gt;    &lt;br&gt;&lt;font face="Courier New"&gt;Category –&amp;gt; Product –&amp;gt; Order&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;And deleting a &lt;font face="Courier New"&gt;Category&lt;/font&gt; deletes its &lt;font face="Courier New"&gt;Products&lt;/font&gt; which in turn deletes its &lt;font face="Courier New"&gt;Orders&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;The EF can, in rare circumstances, fail to sync up with the database when you delete a Category.&lt;/p&gt;  &lt;p&gt;For example if you have an &lt;font face="Courier New"&gt;Order&lt;/font&gt; loaded that is related to a &lt;font face="Courier New"&gt;Category&lt;/font&gt; via an unloaded &lt;font face="Courier New"&gt;Product&lt;/font&gt;, and you delete the &lt;font face="Courier New"&gt;Category,&lt;/font&gt;the EF won’t know to delete the &lt;font face="Courier New"&gt;Order&lt;/font&gt;.&lt;/p&gt;  &lt;p&gt;This means the &lt;font face="Courier New"&gt;Order&lt;/font&gt; will remain in the &lt;font face="Courier New"&gt;ObjectContext&lt;/font&gt; in the unchanged state, despite it having been deleted in the database.&lt;/p&gt;  &lt;p&gt;Forewarned is forearmed.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9874808" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.msdn.com/alexj/archive/tags/EF+4.0/default.aspx">EF 4.0</category><category domain="http://blogs.msdn.com/alexj/archive/tags/EF+Internals/default.aspx">EF Internals</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Cascade+Delete/default.aspx">Cascade Delete</category></item><item><title>Tip 32 – How to create a database from SSDL – EF 4 only</title><link>http://blogs.msdn.com/alexj/archive/2009/08/12/tip-32-how-to-create-a-database-from-ssdl-ef-4-only.aspx</link><pubDate>Wed, 12 Aug 2009 03:41:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9865251</guid><dc:creator>AlexJ</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/alexj/comments/9865251.aspx</comments><wfw:commentRss>http://blogs.msdn.com/alexj/commentrss.aspx?PostID=9865251</wfw:commentRss><description>&lt;P&gt;We recently released a &lt;A href="http://blogs.msdn.com/adonet/archive/2009/06/22/announcing-entity-framework-feature-ctp-1.aspx" mce_href="http://blogs.msdn.com/adonet/archive/2009/06/22/announcing-entity-framework-feature-ctp-1.aspx"&gt;CTP&lt;/A&gt; that extends EF 4 Beta 1 which included Code Only. &lt;/P&gt;
&lt;P&gt;You can read more about Code Only &lt;A href="http://blogs.msdn.com/efdesign/archive/2009/06/10/code-only.aspx" mce_href="http://blogs.msdn.com/efdesign/archive/2009/06/10/code-only.aspx"&gt;here&lt;/A&gt;, &lt;A href="http://blogs.msdn.com/adonet/archive/2009/06/22/feature-ctp-walkthrough-code-only-for-entity-framework.aspx" mce_href="http://blogs.msdn.com/adonet/archive/2009/06/22/feature-ctp-walkthrough-code-only-for-entity-framework.aspx"&gt;here&lt;/A&gt; and &lt;A href="http://blogs.msdn.com/efdesign/archive/2009/08/03/code-only-enhancements.aspx" mce_href="http://blogs.msdn.com/efdesign/archive/2009/08/03/code-only-enhancements.aspx"&gt;here&lt;/A&gt;. &lt;BR&gt;&lt;BR&gt;If you look at the walkthroughs for Code Only you will see code that looks something like this:&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;// Create a builder and configure it &lt;BR&gt;var builder = new ContextBuilder&amp;lt;MyContext&amp;gt;(); &lt;BR&gt;…&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;// Create a context &lt;BR&gt;var mycontext = builder.Create(sqlConnection);&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;// Prepare the Context &lt;BR&gt;if (!myContext.DatabaseExists()) &lt;BR&gt;&amp;nbsp;&amp;nbsp; myContext.CreateDatabase();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;CreateDatabase()&lt;/FONT&gt;, &lt;FONT face="Courier New"&gt;DropDatabase()&lt;/FONT&gt;, &lt;FONT face="Courier New"&gt;DatabaseExists()&lt;/FONT&gt; and &lt;FONT face="Courier New"&gt;CreateDatabaseScripts()&lt;/FONT&gt; are all extension methods that ship in the Code Only assembly.&lt;/P&gt;
&lt;P&gt;And here’s the neat thing: These extension methods are orthogonal to the rest of Code Only. &lt;/P&gt;
&lt;P&gt;You can use these extension methods with any &lt;FONT face="Courier New"&gt;ObjectContext&lt;/FONT&gt;, regardless of whether Code-Only was used to create it.&lt;/P&gt;
&lt;P&gt;So you can call these methods on *any* ObjectContext.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Imagine this scenario:&lt;/STRONG&gt; Someone else on your team has checked-in an EDMX as part of the project, but when you check out you find their are no database scripts. You could now use Code-Only to create a local database. &lt;/P&gt;
&lt;P&gt;These methods look at the database model described in &lt;FONT face="Courier New"&gt;ObjectContext.MetadataWorkspace&lt;/FONT&gt;, and for example produce and execute DDL.&lt;/P&gt;
&lt;P&gt;Cool huh?&lt;/P&gt;
&lt;P&gt;Now as always this tip comes with some caveats*:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;At the moment this only works with EF 4 Beta1. We will ship new versions of Code Only to work with later versions of EF 4 as and when they drop. &lt;/LI&gt;
&lt;LI&gt;&lt;FONT face="Courier New"&gt;CreateDatabase()&lt;/FONT&gt; doesn’t know how to handle everything in the storage model. So for example if your EDMX references database Views or Stored Procedures, Code Only won’t know how to fabricate the database equivalents.&lt;/LI&gt;
&lt;LI&gt;At the moment this only works with SQL Server. We have plans to add a provider model to Code-Only, but that is not there yet.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Despite these limitations, there are doubtless situations where &lt;FONT face="Courier New"&gt;CreateDatabase()&lt;/FONT&gt; and its chums will be useful. &lt;BR&gt;&lt;BR&gt;So enjoy!&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#808080&gt;*It wouldn’t be a tip without caveats :)&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9865251" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/alexj/archive/tags/Tips/default.aspx">Tips</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://blogs.msdn.com/alexj/archive/tags/EF+4.0/default.aspx">EF 4.0</category><category domain="http://blogs.msdn.com/alexj/archive/tags/Code+Only/default.aspx">Code Only</category><category domain="http://blogs.msdn.com/alexj/archive/tags/SSDL/default.aspx">SSDL</category></item></channel></rss>