<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Tim Mallalieu's Blog.</title><subtitle type="html">Just a PM's random musings on data, models, services... </subtitle><id>http://blogs.msdn.com/timmall/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/timmall/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2006-06-21T20:16:00Z</updated><entry><title>Correction...</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/08/13/correction.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/08/13/correction.aspx</id><published>2008-08-14T06:36:00Z</published><updated>2008-08-14T06:36:00Z</updated><content type="html">&lt;P&gt;Greg Young pointed out that I inadvertently perpetuated the canonical model stuff when I said the following:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;To be clear, one misconception is that we were trying to deliver on the old promise of canonical schemas, &lt;FONT color=#0000ff&gt;when we said one common model we meant a single shape for a given concern in the org (say Customer).&lt;/FONT&gt; Specifically what we mean is a common representation or metamodel through which one can reason about the various concepts. For example, if an ecosystem of services&amp;nbsp; (say Reporting Services, Sync, Analysis Services, Integration Services, Workflow) new how to reason about a common representation for an entity and a relationship then custom apps, packaged apps and database instances that exposed the metadata about their concepts in terms of this metamodel could play in terms of tooling, integration and the basic offerings of these services. The canonical example that we use is the idea of something like MS CRM or SharePoint exposing their metadata as EDM. If they could do so and if there was a mechanism for accessing these stores in terms of the EDM (say an ADO.NET provider like Entity Client) then one could get a reporting, synchronization and ETL experience over these solutions that would be consistent with what one could get over a SQL Server database.&lt;/EM&gt; &lt;/P&gt;
&lt;P&gt;I spaced on that paragraph. What I should have said is a common metamodel (entities and relationships) with which one could describe shapes. An example of a shape that could be described would be a Customer in terms of a Customer Entity. There may be "n" Customer Entity Types defined in a given enterprise ... the shape customer is not the thing that is interesting to be common. The notion of an Entity and the means for reasoning about Entities in a common way is interesting.&lt;/P&gt;
&lt;P&gt;Thanks Greg... for pointing this out.&lt;/P&gt;
&lt;P&gt;Tim M&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8863875" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>A Brief History in ENTITIES (... or what the Heck is this EF THing?) - part I</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/08/11/a-brief-history-in-entities-or-what-the-heck-is-this-ef-thing-part-i.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/08/11/a-brief-history-in-entities-or-what-the-heck-is-this-ef-thing-part-i.aspx</id><published>2008-08-12T02:54:00Z</published><updated>2008-08-12T02:54:00Z</updated><content type="html">&lt;P&gt;So, it seemed like it would be useful to talk a bit about why we built the EF and the EDM, what we think it is and where we think it is going.&lt;/P&gt;
&lt;P&gt;A lot of docs exist on the EF and EDM. One can find many opinions on both all over the web. I wanted to take time to talk about them from my perspective as a person who has been on the team since its inception. This is merely my perspective and rationale, not intended to be spin. Hopefully it will clarify some things, hopefully it will promote more candid feedback and debate. &lt;/P&gt;
&lt;H2&gt;&lt;FONT color=#ff8000&gt;Starting at the beginning&amp;nbsp; (kind of) -&amp;gt; the making of the EDM&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;Back in the days when we were working on the Whidbey Release (VS 2005), I was in a team called MBF (Microsoft Business Framework). We were building an application framework for ISV's focusing on writing LOB applications. At the same time there was the ObjectSpaces team and the WinFS teams working on technologies which all had one common overlap... MBF, ObjectSpaces and WinFS all had some form of object persistence.&lt;/P&gt;
&lt;P&gt;There was an attempt to rationalize these technologies (it is probably worthwhile to add that none of these technologies ended up shipping). One of the artifacts of the rationalization effort, however, was this thing called the Entity Data Model. The Entity Data Model (previously referred to as the Common Data Model) was an attempt to align the WinFS Item Data Model, the MBF data model and asks from across a series of partners (internal and external). The end goal of the Common Data model was to unify data models that were emerging across the company. For example, just within the SQL Server division there were data models for Reporting Services (SMDL), Analysis Services (UDM), System Management (SMO) and WinFS (IDM). These data models all represented one common characteristic, they tended to be one level higher than the logical model that people were defining for the store. Consider DBA's who were building logical models and deploying them (resulting in a particular physical data model), these new data models tended to be somewhat higher level and represented a more domain specific transformation of the shapes defined in the "authoritative" logical model. &lt;/P&gt;
&lt;P&gt;The desire was to be able to provide a common data model that could unify the core concepts of these different data models so that we could unify the sets of services and our investments in tooling so that they could all be based on a single, higher level model. Furthermore, there was an expectation that if one could define a common data model then other services like ETL (via SQL Server Integration Services), Sync (via our Sync Framework) could then operate against a common data model. In fact, you could start building out a horizontal platform for data programmability in terms of this common data model. &lt;/P&gt;
&lt;P&gt;To be clear, one misconception is that we were trying to deliver on the old promise of canonical schemas, when we said one common model we meant a single&amp;nbsp;set of concepts with which one could describe nouns in an application&amp;nbsp;(say Customer). Specifically what we mean is a common representation or metamodel through which one can reason about the various concepts. For example, if an ecosystem of services&amp;nbsp; (say Reporting Services, Sync, Analysis Services, Integration Services, Workflow) new how to reason about a common representation for an entity and a relationship then custom apps, packaged apps and database instances that exposed the metadata about their concepts in terms of this metamodel could play in terms of tooling, integration and the basic offerings of these services. The canonical example that we use is the idea of something like MS CRM or SharePoint exposing their metadata as EDM. If they could do so and if there was a mechanism for accessing these stores in terms of the EDM (say an ADO.NET provider like Entity Client) then one could get a reporting, synchronization and ETL experience over these solutions that would be consistent with what one could get over a SQL Server database. &lt;/P&gt;
&lt;H2&gt;&lt;FONT color=#ff8000&gt;So now you have the desire for a common data model -&amp;gt; shouldn't that be the CLR type system?&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;The most common question that was asked was why did there need to be a new data model why couldn't you just model everything in the CLR. The objections to using the CLR ended up along the following lines&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Not all services discussed would be for the managed (.NET) platform &lt;/LI&gt;
&lt;LI&gt;Most of the data models that were being aligned were relational models &lt;/LI&gt;
&lt;LI&gt;Many of the teams did not need an object persistence solution... they needed the ability to expose metadata about their storage in a common representation &lt;/LI&gt;
&lt;LI&gt;The concrete models that were defined were typically projections of a relational model and preserved relational semantics with a more domain specific shape &lt;/LI&gt;&lt;/UL&gt;
&lt;H2&gt;&lt;FONT color=#ff8000&gt;OK so you don't want to use the CLR as the core model, why did you have to introduce things like first class relationships&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;The existence of first class relationships was a hotly contested topic during the formative days of the EDM, many of the architects behind the EDM were rooted in the relational world. Simultaneously as we looked at most of the models that we were trying to align on, they all had notions of first class relationships that carried particular semantics and to which one could ascribe constraints. When one "binds to the CLR", for example by using the Entity Framework to retrieve objects from a persistent store the existence of relationships should not be a matter. Relationships can be surfaced in the CLR realization of an EDM model as navigation properties or collections on a class and thus one gets the experience of references and collection.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff8000&gt;EDM Overview&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;From a developer’s perspective the Entity Data Model can be thought of as a way to define a model for a given application or system. For example, if one were building an application for a video library, the domain model may look something like:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;Type: Video {ID, Title, Description, PublishDate, Actors*}
Type: Person {ID, FirstName, LastName }
Type: Actor: Person {Gender, Bio} 
Type: Customer: Person {Address}
Type: Rental {ID, Video, Customer, RentalDate, DueDate}&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;In the above case, these items look much like the “nouns” in the system. Many application developers would build such a domain model using UML or, in Visual Studio, some may start with the Class Diagram tool. Other developers like to start by designing the database or leveraging an existing database and then building a data access layer that surfaces the data up to their application in whatever shape they desire.&lt;/P&gt;
&lt;P&gt;Note that both models represent the same concepts, but in very different ways. The class diagram reflects an application developer’s view of the abstractions; the database model represents a model that is better suited to data persistence.&lt;/P&gt;
&lt;P&gt;Even though the shape of the models are different, the basic concepts used to define the models are the same. There is some notion of a “Thing” (class, table) and a notion of a relationship between “things” (associations). The Entity Data Model builds on these concepts to allow a developer to define a domain model that can map to classes and tables and that can be rationalized with other models. The basic building blocks of the Entity Data Model are Entity Types (analogous to the “thing”) and Relationships (which relate Entity Types). In the next few sections we will work through the various concepts in the Entity Data Model. The Entity Data Model, in version 1.0 of the product, can be represented in an XML form or can be edited using the Entity Framework Tools. For the purpose of this discussion we will show both forms.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff8000&gt;Entity Types&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Entity Types represents the first class nouns in the data model. Entity Types have the following characteristics:&lt;/P&gt;
&lt;P&gt;&lt;B&gt;Members: &lt;/B&gt;&lt;/P&gt;
&lt;P&gt;An Entity Type has two types of members, properties and navigation properties. &lt;/P&gt;
&lt;P&gt;&lt;B&gt;&lt;I&gt;Properties&lt;/I&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Properties are first class members of the type, if one considers the example of the Video Type from the video library:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;Type: Video {ID, Title, Description, PublishDate, Actors*}&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The ID, Title, Description, PublishDate are all properties of the type. These properties can be primitive types or complex types (inline types analogous to structs) but cannot be other Entity Types or Collections of primitive or complex types.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;&amp;lt;Property Name=&lt;SPAN class=str&gt;"ID"&lt;/SPAN&gt; Type=&lt;SPAN class=str&gt;"Int32"&lt;/SPAN&gt; /&amp;gt;
&amp;lt;Property Name=&lt;SPAN class=str&gt;"Title"&lt;/SPAN&gt; Type=&lt;SPAN class=str&gt;"String"&lt;/SPAN&gt; /&amp;gt;
&amp;lt;Property Name=&lt;SPAN class=str&gt;"Description"&lt;/SPAN&gt; Type=&lt;SPAN class=str&gt;"String"&lt;/SPAN&gt; /&amp;gt;
&amp;lt;Property Name=&lt;SPAN class=str&gt;"PublishDate"&lt;/SPAN&gt; Type=&lt;SPAN class=str&gt;"DateTime"&lt;/SPAN&gt; /&amp;gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;&lt;B&gt;&lt;I&gt;Navigation Properties&lt;/I&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Navigation properties provide a syntactic helper property on Entity Types, that surface the ends of relationships in an Entity Type. Consider the Types Video and Actor:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;Type: Video {ID, Title, Description, PublishDate, Actors*}
Type: Actor: Person {Gender, Bio}&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The Actors member on the Video type represents a collection of related Actor entities. In the Entity Framework, this set of related actor entities is defined by a relationship. The Navigation Property “Actors” allows someone to reason about the relationship from the perspective of the Enclosing type.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;&amp;lt;NavigationProperty Name=&lt;SPAN class=str&gt;"Actors"&lt;/SPAN&gt; Relationship=&lt;SPAN class=str&gt;"VideoLibModel.ActorVideo"&lt;/SPAN&gt; FromRole=&lt;SPAN class=str&gt;"Video"&lt;/SPAN&gt; ToRole=&lt;SPAN class=str&gt;"Actor"&lt;/SPAN&gt; /&amp;gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;&lt;B&gt;Distinct Identity:&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Much like Primary Keys in a database, Entity Types have a distinct identity which is represented by members of the type. The identity of an Entity Type is represented by an EntityKey which identifies the properties that makeup the Identity. In the case of the Video type the Identity is represented by the ID property. &lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;&amp;lt;Key&amp;gt;
    &amp;lt;PropertyRef Name=&lt;SPAN class=str&gt;"ID"&lt;/SPAN&gt; /&amp;gt;
&amp;lt;/Key&amp;gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The entire specification for the video entity type can be represented as follows:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;&amp;lt;EntityType Name=&lt;SPAN class=str&gt;"Video"&lt;/SPAN&gt;&amp;gt;
    &amp;lt;Key&amp;gt;
        &amp;lt;PropertyRef Name=&lt;SPAN class=str&gt;"ID"&lt;/SPAN&gt; /&amp;gt;
    &amp;lt;/Key&amp;gt;

    &amp;lt;Property Name=&lt;SPAN class=str&gt;"ID"&lt;/SPAN&gt; Type=&lt;SPAN class=str&gt;"Int32"&lt;/SPAN&gt; /&amp;gt;
    &amp;lt;Property Name=&lt;SPAN class=str&gt;"Title"&lt;/SPAN&gt; Type=&lt;SPAN class=str&gt;"String"&lt;/SPAN&gt; /&amp;gt;
    &amp;lt;Property Name=&lt;SPAN class=str&gt;"Description"&lt;/SPAN&gt; Type=&lt;SPAN class=str&gt;"String"&lt;/SPAN&gt; /&amp;gt;
    &amp;lt;Property Name=&lt;SPAN class=str&gt;"PublishDate"&lt;/SPAN&gt; Type=&lt;SPAN class=str&gt;"DateTime"&lt;/SPAN&gt; /&amp;gt;

    &amp;lt;NavigationProperty Name=&lt;SPAN class=str&gt;"Actors"&lt;/SPAN&gt; Relationship=&lt;SPAN class=str&gt;"VideoLibModel.ActorVideo"&lt;/SPAN&gt; FromRole=&lt;SPAN class=str&gt;"Video"&lt;/SPAN&gt; ToRole=&lt;SPAN class=str&gt;"Actor"&lt;/SPAN&gt; /&amp;gt;
&amp;lt;/EntityType&amp;gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff8000&gt;Relationships&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;One of the primary concepts of the Entity Data Model is the notion of first class relationships. Whereas one can surface the relationship between two types as a NavigationProperty, the actual model concept is a relationship. In the first version of the Entity Data Model the only type of relationship that can be defined is an &lt;A href="http://msdn2.microsoft.com/en-us/library/bb399198.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/bb399198.aspx"&gt;Association&lt;/A&gt;. Consider the relationship between the Video and Actor, one could express this as: &lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;Association{Video[*]:Actor[*]}&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;Where this is an Association between two Entity Types, Video and Actor each of which can have a multiplicity of many, hence a many to many relationship between Actor and Video.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;&amp;lt;Association Name=&lt;SPAN class=str&gt;"ActorVideo"&lt;/SPAN&gt;&amp;gt;
    &amp;lt;End Type=&lt;SPAN class=str&gt;"VideoLibModel.Actor"&lt;/SPAN&gt; Role=&lt;SPAN class=str&gt;"Actor"&lt;/SPAN&gt; Multiplicity=&lt;SPAN class=str&gt;"*"&lt;/SPAN&gt; /&amp;gt;
    &amp;lt;End Type=&lt;SPAN class=str&gt;"VideoLibModel.Video"&lt;/SPAN&gt; Role=&lt;SPAN class=str&gt;"Video"&lt;/SPAN&gt; Multiplicity=&lt;SPAN class=str&gt;"*"&lt;/SPAN&gt; /&amp;gt;
&amp;lt;/Association&amp;gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The EDM supports the following multiplicities on each side of the relationship:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Zero or One (0..1) &lt;/LI&gt;
&lt;LI&gt;Exactly One (1) &lt;/LI&gt;
&lt;LI&gt;Zero or More (*) &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;FONT color=#ff8000&gt;Complex Types&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/bb738466.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/bb738466.aspx"&gt;Complex types&lt;/A&gt; provide a named structural representation much like an Entity Type. The difference between a Complex Type and an Entity Type is principally that Complex Types do not have an explicit identity, cannot reference instances of EntityTypes and are only “reachable” via dereference from an EntityType.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff8000&gt;Sets&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Defining the core types is the first step. In order to take these concepts and actually build a model where one can reason about storage of instances we need to introduce the concepts of sets. Once one has a concept of sets it is often useful to define some construct that describes the closure of meaningful sets. Within the EDM these concepts are the Entity &amp;amp; Relationship Sets and the Entity Container.&lt;/P&gt;
&lt;P&gt;Entity Sets, as the name implies, define the storage for instances of entity types. Entity Sets are nominal and typed, in other words an Entity Set has a name and declares the type of instances that can be contained within the set. Entity Sets are also polymorphic which means that a given Entity Set can store instances of its declared type and any derived types.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;&amp;lt;EntitySet Name=&lt;SPAN class=str&gt;"Videos"&lt;/SPAN&gt; EntityType=&lt;SPAN class=str&gt;"VideoLibModel.Video"&lt;/SPAN&gt;/&amp;gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The above statement declares an Entity Set with the name Videos and of Type VideoLibModel.Video… if Video had any derived types these would be legal members of this EntitySet.&lt;/P&gt;
&lt;P&gt;In the EDM there is no single Entity Set for instances of a type. If one desired, one could create multiple Entity Sets where one would store different instances. So, for example if one wanted to create an Entity Set for Cartoons and an Entity Set for Dramas one could do so:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;&amp;lt;EntitySet Name=&lt;SPAN class=str&gt;"Cartoons"&lt;/SPAN&gt; EntityType=&lt;SPAN class=str&gt;"VideoLibModel.Video"&lt;/SPAN&gt;/&amp;gt;
&amp;lt;EntitySet Name=&lt;SPAN class=str&gt;"Dramas"&lt;/SPAN&gt; EntityType=&lt;SPAN class=str&gt;"VideoLibModel.Video"&lt;/SPAN&gt;/&amp;gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;As relationships are first class concepts in the EDM, one must declare a relationship set for a relationship. The relationship set is the declaration which associates instances of a given set with instances of another set… it is done purely in terms of the storage (sets) as opposed to the types:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE class=csharpcode&gt;&amp;lt;AssociationSet Name=&lt;SPAN class=str&gt;"ActorVideo"&lt;/SPAN&gt; Association=&lt;SPAN class=str&gt;"VideoLibModel.ActorVideo"&lt;/SPAN&gt;&amp;gt;
&amp;lt;End Role=&lt;SPAN class=str&gt;"Actor"&lt;/SPAN&gt; EntitySet=&lt;SPAN class=str&gt;"People"&lt;/SPAN&gt; /&amp;gt;
&amp;lt;End Role=&lt;SPAN class=str&gt;"Video"&lt;/SPAN&gt; EntitySet=&lt;SPAN class=str&gt;"Videos"&lt;/SPAN&gt; /&amp;gt;
&amp;lt;/AssociationSet&amp;gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;STYLE type=text/css&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The above is the definition of the relationship set corresponding to the relationship between Actors and Videos. Note this presupposes that there exists an Entity Set called People and an Entity Set called Videos.&lt;/P&gt;
&lt;P&gt;The construct that demarks the closure around Entity Sets and Relationship Sets is the Entity Container. An Entity Container is merely a named “thing” through which one can reason about or dereference a group of Entity Sets and Relationship Sets.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff8000&gt;On the use of XML&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The examples are in XML because the V1.0 version of the Entity Framework uses an XML representation of the EDM as its basis for representing EDM. As we move forward with the EDM and the Entity Framework we expect that there will be different representations of the EDM. For example one should be able to describe an EDM model in the CLR by convention and extend/specialize it with configuration (attributes or external). We also expect that particular partners will maintain their models in metadata repositories.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8849512" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>Look Mom... no XML</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/07/18/look-mom-no-xml.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/07/18/look-mom-no-xml.aspx</id><published>2008-07-18T21:31:00Z</published><updated>2008-07-18T21:31:00Z</updated><content type="html">&lt;P&gt;We just wrapped up our first iteration of V2.&lt;/P&gt;
&lt;P&gt;We are shooting to get another iteration in before PDC and are still working on how we can get early bits out to customers outside of the rhythms of the CTP's and such.&lt;/P&gt;
&lt;P&gt;One of the nifty things in our first iteration, though, was some of the work that we did around &lt;A href="http://blogs.msdn.com/efdesign/archive/2008/06/24/initial-poco-design-1-pager.aspx" mce_href="http://blogs.msdn.com/efdesign/archive/2008/06/24/initial-poco-design-1-pager.aspx"&gt;POCO&lt;/A&gt;. There is a lot more to be done with POCO, we need to still deliver lazy load, value objects and more. With these bits, however, it is possible to write basic POCO code now. &lt;/P&gt;
&lt;P&gt;For a simple experiment I decided to see if I could use these bits to provide a code-first experience with none of the XML artifacts we have in a typical EF application. The support for doing this without XML artifacts on disk is all implemented via public surface from V1....&lt;/P&gt;
&lt;P&gt;Here is the end experience:&lt;/P&gt;&lt;PRE class=csharpcode&gt;            Northwind northwind = ContextFactory.CreateContext&amp;lt;Northwind&amp;gt;(&lt;SPAN class=str&gt;@"Data Source=.\sqlexpress;Initial Catalog=Northwind;Integrated Security=True"&lt;/SPAN&gt;);

            var prods = from p &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; northwind.Products &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; p.UnitPrice &amp;gt; 50 select p;

            &lt;SPAN class=kwrd&gt;foreach&lt;/SPAN&gt; (Product p &lt;SPAN class=kwrd&gt;in&lt;/SPAN&gt; prods)
            {
                Console.WriteLine(String.Format(&lt;SPAN class=str&gt;"[{0}] : {1} - {2}"&lt;/SPAN&gt;, p.ProductID,p.ProductName, p.UnitPrice ) );
            }&lt;BR&gt;&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The Context and the Product Class are as follows:&lt;/P&gt;&lt;PRE class=csharpcode&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Product
    {
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;int&lt;/SPAN&gt; ProductID { get; set; }
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; ProductName { get; set; }
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Decimal UnitPrice { get; set; }
    }

    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; Northwind : ObjectContext
    {
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; Northwind(EntityConnection conn) : &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;(conn) { }

        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; ObjectQuery&amp;lt;Product&amp;gt; Products
        {
            get
            {
                &lt;SPAN class=kwrd&gt;if&lt;/SPAN&gt; (&lt;SPAN class=kwrd&gt;null&lt;/SPAN&gt; == _products)
                {
                    _products = &lt;SPAN class=kwrd&gt;base&lt;/SPAN&gt;.CreateQuery&amp;lt;Product&amp;gt;(&lt;SPAN class=str&gt;"Northwind.Products"&lt;/SPAN&gt;);
                }
                &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; _products;
            }
        }

        &lt;SPAN class=kwrd&gt;private&lt;/SPAN&gt; ObjectQuery&amp;lt;Product&amp;gt; _products;
    }&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The above code has no requirement (for instances) on the EF.&lt;/P&gt;
&lt;P&gt;The ObjectContext is nice to have as the session of interaction with the store... providing the ObjectQuery properties yields a target for formulating the LINQ queries.&lt;/P&gt;
&lt;P&gt;The entry point for being able to use this code without artifacts is the ContextFactory. The ContextFactory reflects over the Context type that one wrote by hand. It looks for all properties of type ObjectQuery&amp;lt;T&amp;gt; and then uses these to define an in-memory representation of the models (conceptual, store, mapping) which are then passed to the metadata infrastructure.&lt;/P&gt;&lt;PRE class=csharpcode&gt;    &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;class&lt;/SPAN&gt; ContextFactory
    {
        &lt;SPAN class=kwrd&gt;public&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; T CreateContext&amp;lt;T&amp;gt;(&lt;SPAN class=kwrd&gt;string&lt;/SPAN&gt; connectionString) &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; T : ObjectContext
        {
            MetadataWorkspace workspace = CreateMetadataWorkspace&amp;lt;T&amp;gt;();
            SqlConnection storeConn = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; SqlConnection(connectionString);
            EntityConnection entityConn = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; EntityConnection(workspace, storeConn);
            ConstructorInfo contextConstructor = &lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(T).GetConstructor(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Type[] { &lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(EntityConnection)});            
            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; (T)contextConstructor.Invoke(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; Object[] { entityConn});            
        }


        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; MetadataWorkspace CreateMetadataWorkspace&amp;lt;T&amp;gt;() &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; T : ObjectContext
        {
            MetadataWorkspace workspace = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MetadataWorkspace();
            &lt;SPAN class=rem&gt;//--- build collections&lt;/SPAN&gt;
            EdmItemCollection edmCollection = CreateEdmItemCollection&amp;lt;T&amp;gt;();
            StoreItemCollection storeCollection = CreateStoreItemCollection&amp;lt;T&amp;gt;();
            MappingItemCollection mappingCollection = CreateMappingCollection&amp;lt;T&amp;gt;(edmCollection, storeCollection);
            &lt;SPAN class=rem&gt;//--- register collections            &lt;/SPAN&gt;
            workspace.RegisterItemCollection(edmCollection);
            workspace.RegisterItemCollection(storeCollection);
            workspace.RegisterItemCollection(mappingCollection);
            workspace.RegisterItemCollection(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; ObjectItemCollection());
            workspace.LoadFromAssembly(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(T).Assembly);
            &lt;SPAN class=rem&gt;//--- done&lt;/SPAN&gt;
            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; workspace;
        }

        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; EdmItemCollection CreateEdmItemCollection&amp;lt;T&amp;gt;() &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; T : ObjectContext
        {
            CodeFirst.CSDL.TSchema schema = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; CsdlBuilder().BuildSchema&amp;lt;T&amp;gt;();
            EdmItemCollection edmCollection = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; EdmItemCollection(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; XmlReader[]{GetXmlStream(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(CodeFirst.CSDL.TSchema),schema)});
            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; edmCollection;
        }

        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; StoreItemCollection CreateStoreItemCollection&amp;lt;T&amp;gt;() &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; T : ObjectContext
        {
            CodeFirst.SSDL.TSchema schema = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; SsdlBuilder().BuildSchema&amp;lt;T&amp;gt;();
            StoreItemCollection storeCollection = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; StoreItemCollection(&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; XmlReader[] { GetXmlStream(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(CodeFirst.SSDL.TSchema), schema) });
            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; storeCollection;
        }

        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; StorageMappingItemCollection CreateMappingCollection&amp;lt;T&amp;gt;(EdmItemCollection edmCollection,StoreItemCollection storeCollection) &lt;SPAN class=kwrd&gt;where&lt;/SPAN&gt; T : ObjectContext
        {
            TMapping schema = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MslBuilder().BuildMapping&amp;lt;T&amp;gt;();
            StorageMappingItemCollection mslCollection = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; StorageMappingItemCollection(edmCollection,storeCollection,&lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; XmlReader[] { GetXmlStream(&lt;SPAN class=kwrd&gt;typeof&lt;/SPAN&gt;(TMapping), schema) });
            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; mslCollection;
        }

        &lt;SPAN class=kwrd&gt;protected&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;static&lt;/SPAN&gt; XmlReader GetXmlStream(Type schemaType, Object schema)
        {
            XmlSerializer schemaSerializer = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; XmlSerializer(schemaType);
            MemoryStream schemaStream = &lt;SPAN class=kwrd&gt;new&lt;/SPAN&gt; MemoryStream();            
            schemaSerializer.Serialize(schemaStream, schema);
            schemaStream.Position = 0;
            XmlReader reader = XmlReader.Create(schemaStream);           
            &lt;SPAN class=kwrd&gt;return&lt;/SPAN&gt; reader;
        }
    }&lt;/PRE&gt;
&lt;STYLE type=text/css&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/STYLE&gt;

&lt;P&gt;The "builder" classes (SsdlBuilder, CsdlBuilder, MslBuilder) merely use the Type that is supplied to infer a model and return an in-memory representation which can be serialized to our XML representation. We are looking at public mutable API's and code-first surface in V2 which would allow people to do this without having to roll a separate OM.&lt;/P&gt;
&lt;P&gt;As soon as we get the latest EF bits out in the wild I can share the sample so that people can play with it - it is hacky PM code but it illustrates the usage of the public surface to have an alternative representation of the requisite metadata. It is also a good exercise to illustrate that for the ORM developer scenario, the EDM and related artifacts can be perceived as implementation detail. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8750695" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>Newsflash: EF V1.0 was not intended to be a NHibernate compete</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/07/17/newsflash-ef-v1-0-was-not-intended-to-be-a-nhibernate-compete.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/07/17/newsflash-ef-v1-0-was-not-intended-to-be-a-nhibernate-compete.aspx</id><published>2008-07-18T07:19:00Z</published><updated>2008-07-18T07:19:00Z</updated><content type="html">&lt;P&gt;I spent some time this week with Scott Bellware. He and &lt;A href="http://codebetter.com/blogs/gregyoung/" mce_href="http://codebetter.com/blogs/gregyoung/"&gt;Greg Young&lt;/A&gt; have been in town talking to the EF team about Test Driven Development, Behavioral Driven Design and Domain Driven Design. &lt;/P&gt;
&lt;P&gt;On Tuesday night we went out to dinner and had a long chat. Despite the desire on both of our parts to insult each other every few minutes, I think the conversation was largely productive. The events of the evening plus my preparation for the Advisory Council made me think about going into some more detail around the EF, where we are today, where we want to go and rationale therein.&lt;/P&gt;
&lt;P&gt;This is not intended to be "spin" - a word I have heard a lot recently. This is the opinion of a PM on the team that has been at this since pretty much the beginning.&lt;/P&gt;
&lt;P&gt;Back to the point of this post:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;We did not set out to build the NHibernate compete product in V1.0.&lt;/EM&gt; &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;We did set out to execute on the first part of a longer term strategy around the EDM and the set of services that could be delivered therein. ORM happens to be one of the scenarios and the one that you tend to most closely approximate as you build out the foundation.&lt;/P&gt;
&lt;P&gt;One of the major points that Scott repeated at dinner was that he and his compatriots feel that people would just blindly adopt the EF because it was a part of the Framework and that this would set them back because they have moved on with their approach to software development and the EF does not meet their requirements. Having the EF in the market creates noise for them because it becomes a technology choice between a Microsoft product that does not yet address this school of software development and open source solutions that do.&lt;/P&gt;
&lt;P&gt;There are &lt;A href="http://martinfowler.com/bliki/SchoolsOfSoftwareDevelopment.html" mce_href="http://martinfowler.com/bliki/SchoolsOfSoftwareDevelopment.html"&gt;schools of software development&lt;/A&gt; that will do just fine with the EF. There are others where the approaches at hand would require developers to compromise their abstractions and their approaches. People should just be intentional and not try to use the EF as a wonder hammer to hit all potential projects. As with any other technology, it should be evaluated in the context of the project constraints and attributes.&lt;/P&gt;
&lt;P&gt;I shall attempt to make a series of posts leading up to and following the advisory council where I go into a bit of the history and future. This will not yield a decision matrix for a developer but it may be interesting for folks.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8746376" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>The Great Entity Smack down</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/07/01/the-great-entity-smack-down.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/07/01/the-great-entity-smack-down.aspx</id><published>2008-07-02T05:10:46Z</published><updated>2008-07-02T05:10:46Z</updated><content type="html">&lt;p&gt;There is a wonderful debate going on right now on the &lt;a href="http://entities.pbwiki.com/FrontPage"&gt;entities wiki&lt;/a&gt;. You need only read some of the comments on the front page to see that different people are sharing their perspectives on application architecture, methodologies and patterns. &lt;/p&gt;  &lt;p&gt;For a couple weeks now I have been stewing over a wacky idea that I think the time is right for. I would like to propose that we should create &amp;quot;The Great Entity Smack Down&amp;quot;. My thought is that we could go get a bunch of folks that represent different perspectives in the community in a public forum. We put together a fictitious development project (oh let's say pet shop for grins) and we get representatives of different camps to discuss/debate how they would approach the project. &lt;/p&gt;  &lt;p&gt;I am going to shake the trees here in Redmond to see if we can host the event. I would love to start a discussion on what people think of the idea, what groups should be represented, what the format should be and how we go about doing it. I think hosting it in front of a .NET user group and advertising it fairly broadly to different communities would be an interesting venue. &lt;/p&gt;  &lt;p&gt;Chime in... provide some ideas... let's get it on.&lt;/p&gt;  &lt;p&gt;Tim M&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8679579" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>Alex James is on point for the EF Design Blog</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/06/28/alex-james-is-on-point-for-the-ef-design-blog.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/06/28/alex-james-is-on-point-for-the-ef-design-blog.aspx</id><published>2008-06-28T17:18:00Z</published><updated>2008-06-28T17:18:00Z</updated><content type="html">&lt;P&gt;Although we want all folks from the team to be able to post content as they saw fit on the &lt;A href="http://blogs.msdn.com/efdesign/" mce_href="http://blogs.msdn.com/efdesign/"&gt;EF Design Blog&lt;/A&gt;, we wanted someone on point to be the person who did actual care &amp;amp; feeding of it. &lt;A href="http://blogs.msdn.com/alexj/" mce_href="http://blogs.msdn.com/alexj/"&gt;Alex James&lt;/A&gt;, one of the PM's on the team is the person on point. Alex just posted a &lt;A href="http://blogs.msdn.com/efdesign/archive/2008/06/27/computed-properties-one-pager.aspx" mce_href="http://blogs.msdn.com/efdesign/archive/2008/06/27/computed-properties-one-pager.aspx"&gt;1-pager&lt;/A&gt; on computed properties on the design blog.&lt;/P&gt;
&lt;P&gt;The computed properties post is an interesting post because it is an example of some of the non-ORM'ish work that we are doing in V2. Funny thing was that we have this somewhat schizophrenic being. On the one hand we solve a number of ORM scenarios - to be fair, we are largely about solving ORM-like scenarios today. On the other hand, however, we are really trying to build something different. In the fullness of time we are trying to align the conceptual models and infrastructure that a lot of the data services (Reporting &amp;amp; Analytics, Sync, ETL...) use.&lt;/P&gt;
&lt;P&gt;Suspend the perspective of today for a second, ignore the debates on reuse of models or applicability of an apps OLTP model for decision support. Here is the thing, if Microsoft can provide a single representation for these services with common tooling and integration then we provide a better developer platform. Sometimes we get caught up in the technology snapshot of today and it is hard to see the forest through the trees. Sometimes we have to go out on a limb and say this is not something we can do in just one release, it requires the laying of a foundation and then alignment across multiple teams and release cycles to provide the real value. I am really excited that we have the first part of the foundation down. I have been on this team for almost 4 years now and it is great to see where we have come and how our partnerships internally are starting to round out the overall platform vision. As mentioned in previous posts, we are working to round out the rest of the foundation plus work on the core developer (ORM, N-Tier...) scenarios and we should be putting out more pieces on the design blog as we progress. Look for more posts from Alex and the team in the weeks/months to come.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8663560" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>New Wiki</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/06/26/new-wiki.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/06/26/new-wiki.aspx</id><published>2008-06-27T05:57:26Z</published><updated>2008-06-27T05:57:26Z</updated><content type="html">&lt;p&gt;So,&amp;#160; &lt;/p&gt;  &lt;p&gt;I just threw up a new &lt;a href="http://entities.pbwiki.com/"&gt;wiki&lt;/a&gt; to collect patterns and practices from the developer community that can help inform our understanding of real world developer scenarios.&lt;/p&gt;  &lt;p&gt;Where did this come from? ... I had a good thread with &lt;a href="http://codebetter.com/blogs/scott.bellware"&gt;Scott Bellware&lt;/a&gt; where he was providing some feedback on his perspective. A bunch of us on the team also exchanged some mail with &lt;a href="http://codebetter.com/blogs/gregyoung/"&gt;Greg Young&lt;/a&gt; about the POCO feature that we pushed out on the &lt;a href="http://blogs.msdn.com/efdesign/"&gt;EF design blog&lt;/a&gt;. After these conversations I was wondering how we could catalog a bunch of the concepts that we were discussing. The concepts were really reflective of the ways that people applied practices like DDD and TDD in the real world today. Sure, we could continue to read books, blogs and such and engage with customers in the way that we have. We could also start thinking about other ways to engage with the community in different ways. &lt;/p&gt;  &lt;p&gt;Why not just mine other sites? ... well we could, I figured it would be an interesting exercise to create a more directed, intentional aggregation of patterns and scenarios specifically targeting how developers want to interact with data and how this surfaces in the ways that they build apps. I would love people to share thinking around how they build data access layers, how they define domain models, how they test, how they expose data services and provide solutions for things like data aggregation, synchronization and offline scenarios.&lt;/p&gt;  &lt;p&gt;I have invited a number of folks to come in and start contributing, hopefully they shall. I would love all interested folks to come on by. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8659606" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>To Lazy Load or not to Lazy load?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/06/24/to-lazy-load-or-not-to-lazy-load.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/06/24/to-lazy-load-or-not-to-lazy-load.aspx</id><published>2008-06-25T05:29:42Z</published><updated>2008-06-25T05:29:42Z</updated><content type="html">&lt;p&gt;I just exchanged email with &lt;a href="http://martinfowler.com/ "&gt;Martin Fowler&lt;/a&gt; about the term Lazy load. The interpretation that we on the Entity Framework team had about Lazy Loading was that on a given query we would not &amp;quot;eagerly&amp;quot; load an entire graph (i.e. load a customer, their orders, order lines and products...) but instead would, by default, retrieve a shallow version of the queried instances. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I believe this definition holds true but is incomplete, according to feedback from Martin. Per our exchange, Martin indicated that the notion of lazy load expects that one does not have to do anything beyond dereference operations to retrieve the related instances. As a result this coding pattern should work:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color: blue"&gt;            using &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MSPetShop4Entities &lt;/span&gt;context = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MSPetShop4Entities&lt;/span&gt;())
            {
                &lt;span style="color: blue"&gt;var &lt;/span&gt;prod1 = (&lt;span style="color: blue"&gt;from &lt;/span&gt;p &lt;span style="color: blue"&gt;in &lt;/span&gt;context.Product &lt;span style="color: blue"&gt;select &lt;/span&gt;p).FirstOrDefault();
                &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(prod1.Category.Name);                
            }&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;In the Entity Framework we were concerned that people using our framework would not be aware that the call prod1.Category.Name above would result in a query to the store. The result was that we require that the person be explicit about making the call to the store before doing the dereference:&lt;/p&gt;

&lt;p&gt;In order for someone to retrieve the related instances one would call the &amp;quot;.Load&amp;quot; method on the reference or collection to indicate that one was indeed willing to execute a subsequent query to the store. &lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;            using &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;MSPetShop4Entities &lt;/span&gt;context = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MSPetShop4Entities&lt;/span&gt;())
            {
                &lt;span style="color: blue"&gt;var &lt;/span&gt;prod1 = (&lt;span style="color: blue"&gt;from &lt;/span&gt;p &lt;span style="color: blue"&gt;in &lt;/span&gt;context.Product &lt;span style="color: blue"&gt;select &lt;/span&gt;p).FirstOrDefault();
                prod1.CategoryReference.Load();
                &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(prod1.Category.Name);                
            }&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;I already mentioned in an earlier post how this can cause a leaky abstraction for people trying to abstract EF. We are looking at this pattern in V2. The interesting thing is whether the second example is lazy loading or not. We had been calling this &amp;quot;explicit lazy loading&amp;quot; but, to Martin's point it is an overload of a clear term and we should not do that. I think we will attempt to refer to this as Explicit Loading without introducing the &amp;quot;lazy&amp;quot; overload to try and be clear moving forward.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8650296" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>POCO Prototype Video...</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/06/24/poco-prototype-video.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/06/24/poco-prototype-video.aspx</id><published>2008-06-25T05:08:49Z</published><updated>2008-06-25T05:08:49Z</updated><content type="html">&lt;p&gt;We just threw up a &lt;a href="http://blogs.msdn.com/efdesign/archive/2008/06/24/initial-poco-design-screencast.aspx"&gt;screencast&lt;/a&gt; on the EF design site to complement the POCO feature design notes. This was a prototype that Mirek (one of the developers on the team) has been doing around a full POCO enabled state manager. &lt;/p&gt;  &lt;p&gt;I am hoping that we can get early builds out of some of this work in the next month or so. We are still trying to figure out how to drop early and often outside of the CTP rhythms and are looking at what the ASP.NET team has been doing with their bits. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8650193" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>First Thing on the EF Design Blog</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/06/24/first-thing-on-the-ef-design-blog.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/06/24/first-thing-on-the-ef-design-blog.aspx</id><published>2008-06-24T22:24:26Z</published><updated>2008-06-24T22:24:26Z</updated><content type="html">&lt;p&gt;We just pushed the first piece of content to the &lt;a href="http://blogs.msdn.com/efdesign/"&gt;EF Design Blog&lt;/a&gt;. This one is a &amp;quot;Feature Design&amp;quot; posting about the &lt;a href="http://blogs.msdn.com/efdesign/archive/2008/06/24/initial-poco-design-1-pager.aspx"&gt;POCO feature&lt;/a&gt; that we are working on for V2. Sometime today we hope to get a quick screen cast of a prototype up. We will actively try and get more content either at the feature definition or design spec level throughout the project lifecycle.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8648577" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>Vote of No Confidence</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2008/06/24/vote-of-no-confidence.aspx" /><id>http://blogs.msdn.com/timmall/archive/2008/06/24/vote-of-no-confidence.aspx</id><published>2008-06-24T19:45:00Z</published><updated>2008-06-24T19:45:00Z</updated><content type="html">&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;So,&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;It's been a long, long time since I have posted anything on my blog. Reality is I tried to maintain a blog where I thought I could come up with wonderfully profound things to share with the world but clearly that was not the case. Having said that a few events have happened that prompted me to start blogging again. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;1: We are about to ship the first version of EF &lt;BR&gt;2: We have an interesting thread going on about a "&lt;/SPAN&gt;&lt;A href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/"&gt;&lt;SPAN style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;vote of no confidence&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;" about our product &lt;BR&gt;3: We are starting work on our next version of the product&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Seems like this would be a good time to throw myself out there. First, to respond to the general thread in the community and secondly to be more available for conversations around the current and future versions of the product.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Anyway... I will attempt to be more available and present. People can always just ping me &lt;/SPAN&gt;&lt;A href="mailto:timmall@microsoft.com"&gt;&lt;SPAN style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;timmall@microsoft.com&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt; directly about any of this.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;In response to the community threads I will paste a response here&amp;nbsp;that I made, yesterday, on an&amp;nbsp;internal thread on the topic....&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;The unfortunate reality is that these are scenarios that we care deeply about but do not fully support in V1.0. I can go into some more detail here. One point to note is that the choices on these features were heavily considered, but we had to deal with the tension between trying to add more features vs. trying to stay true to our initial goal which was to lay the core foundation for a multiple-release strategy for building out a broader data platform offering. Today, coincidentally, marked the start of our work on the next version of the product, and we are determined to address this particular developer community in earnest while still furthering the investment in the overall data platform. Here is my take on the points below and things we are thinking about moving forward:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;INORDINATE FOCUS THE DATA ASPECT OF ENTITIES LEADS TO DEGRADED ENTITY ARCHITECTURES&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;In v1.0 we chose to support default scenarios where one would have a distinguished based class (our EntityObject) and we would provide a mapping solution from these classes to our EDM model and from the EDM model to the database. The reason for this was because the investment we were making was in terms of the EDM – a new conceptual data model that allowed people to describe the shape of their data in terms of their domain instead of the layout in the database. Our goal is to allow people, in the fullness of time to be able to have a set of common services in terms of the Entity Data Model. Today they have query (ESQL) and REST based Services (Astoria describes its metadata using the EDM), they also get a first generation Object Persistence facility with the Object Layer component in the Entity Framework. The Object Layer, of course, also comes with our first class LINQ implementation.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;There are a couple of interesting things here… &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;1: We expose the start of a pure value based API using ADO.NET (Entity Client) so that you can issue ESQL queries against the database in terms of your domain model, in a store agnostic manner (i.e. using ESQL instead of TSQL of PLSQL…) . There are many partners in the building for whom this is the only way they would want to leverage the EF and the EDM. Partners that fall in this camp tend to be interested in queries and presentation, data transformation or stores where the schema is frequently changing (Universal Table implementations) so that relying on CLR classes becomes intractable.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;2: The focus on the EDM for the ORM developer can appear to be a red herring, as we heard from customers. The EDM describes the shape of the domain objects but does not allow for encapsulation of behavior and provides limited constraints and no specific grammar for action-semantics. In order to define a domain model where one wanted to leverage the EDM and EF today one would have to do one of the following: &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Define an EDM model, code-gen classes and implement logic in partial classes. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Define an EDM model and use this as a pure DAO with a parallel set of domain objects – you could abstract the EF via many patterns… the common one we here is the repository pattern (gotchas will be pointed out in the discussion of points below). &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Define an EDM model for query and update and then use LINQ to project into Domain Objects… &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;You get a case for simpler query expression and use LINQ for a projection facility to retrieve and transform from the EDM objects to the true Domain Objects.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;I think there are a couple of things we are trying to do in&amp;nbsp;the next version&amp;nbsp;that can help here, and we actively want the feedback of folks in the community to help make sure we do the right thing:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l2 level1 lfo2; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Code-First scenarios… &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;In the code first scenarios we allow people to define their own classes (POCO) which they can work with as they see fit. We then infer a model from the classes. For situations where one desires to have a model that cannot be inferred directly from the classes, developers will be able to use new CLR attributes or an external mapping specification. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l2 level1 lfo2; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Code-Gen Pipeline… For some framework scenarios it is desirable to start with an EDM model (possibly with custom annotations) and then generate either the DB, the classes or both. We are looking at a general pipeline that developers can plug into that will give a lot of flexibility in generating classes and databases as well as in the way a model can be derived from the database, CLR classes or some other form (maybe a model repository built by a third party, a UML tool, or some other artificat like sharepoint).&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l2 level1 lfo2; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Adding action-semantics to the EDM...&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;We have looked at things we can do here. There are things that would be quite nice but likely they would come at a cost of addressing particular feedback we have heard or our other investments. We will share thoughts and designs on these and see what people think regardless.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;EXCESS CODE NEEDED TO DEAL WITH LACK OF LAZY LOADING&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;The EF, today, does support lazy loading. It does not support IMPLICIT lazy loading… this distinction is subtle but important. In EF we, by default, do not load ends of references or collections we wait until asked to load these. Today, however, one must explicitly ask by calling a .Load method. We took a fairly conservative approach in v1.0, because we wanted developers to be aware of when they were asking the framework to make a roundtrip to the database… our take on “boundaries are explicit”. When one builds out a repository pattern or starts to abstract the EF in some other form of data access abstraction this can become an issue because the need to call an explicit method to perform a lazy load operation causes the EF abstractions to bleed up and now you are struggling with an intersection of concerns as opposed to a clean separation of concerns.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;We have heard this feedback and are looking at supporting optional implicit lazy loading as well as other strategies around eager loading (such as general LoadOptions ala LINQ to SQL) in a future release of the EF&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;Until then, it is possible to build implicit lazy loading on top of the explicit mechanisms which the EF support in v1, and one of our team members has published to his blog and code gallery a sample which demonstrates how this can be done.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;SHARED, CANONICAL MODEL CONTRADICTS SOFTWARE BEST PRACTICES&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;There seems to be confusion around this topic. We are not recommending that folks return to the days where we were evangelizing the use of XSD for “canonical schemas”. I don’t believe that people think that this is tractable. What we do believe, however, is that it is desirable to have a single meta-model (EDM if you will) with which you can describe many domain models and that by having a single grammar we can provide a set of common services on any given domain model. For example, consider an application that is to be written against a database with 600 tables. Do I believe that this app should have a single model with 600 Entity Types in it? No… Furthermore, do I believe that any given domain entity (say Customer) has only one shape in that app and that this shape must be the canonical shape for the entire Enterprise?… Heck no.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;I would expect, however, that with a common way to describe these models I could do some interesting things in the fullness of times… &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL type=disc&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo3; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;I could use reporting services over any instance of one of these models and define reports in terms of the domain entities instead of the underlying tables. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo3; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;I could perform ETL tasks between two stores in terms of entities. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo3; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;I could write sync services between a local store and a remote store where the sync contract and programming model on both sides are in terms of EDM.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l1 level1 lfo3; tab-stops: list .5in"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;If I invested in learning how to build a model to use with some tool like reporting services, I would not have to learn a new tool and model description language when it comes time to build a model for one of the other tools.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;This is the world that we are working towards… We are not there yet, but a number of these scenarios are what we are aggressively pursuing now.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;LACK OF PERSISTENCE IGNORANCE CAUSES BUSINESS LOGIC TO BE HARDER TO READ, WRITE, AND MODIFY, CAUSING DEVELOPMENT AND MAINTENANCE COSTS TO INCREASE AT AN EXAGGERATED RATE&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Agreed. There are different developer segments for whom PI is either important or not. We do not have a good story about PI today. We are working on one. Based on customer feedback from over a year ago, we started work on PI, but we said from the first that we would be unable to complete that work in v1 given the other demands of the release.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;We made some initial steps for v1, and then began planning future steps for the next release.&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;At the last MVP summit we presented an early look at one of the techniques we were investigating which involved performing IL rewrite tricks to support these scenarios. We got strong feedback from many of the signatories on the “vote of no confidence” letter that this was not the right approach, and as a result we are not doing the IL rewrite in the next release. Instead we are doing a full POCO implementation that we hope to get feedback from the community on.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Tomorrow we will post some of the initial thinking on the new “&lt;/SPAN&gt;&lt;A href="http://blogs.msdn.com/efdesign/"&gt;&lt;SPAN style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;EF Design Blog&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;” including a little video of some of the initial dev work we are doing here. It is worthwhile pointing out that this work is a direct response to the feedback we have gotten from this community.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;EXCESSIVE MERGE CONFLICTS WITH SOURCE CONTROL IN TEAM ENVIRONMENT&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;At the end of the day, this is feedback that we have heard, tried to address and are actively addressing moving forward. We are taking steps that we think should help in general:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;1: We intend to have a more &lt;/SPAN&gt;&lt;A href="http://blogs.msdn.com/efdesign/"&gt;&lt;SPAN style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;transparent design process&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;. &lt;BR&gt;2: We have a new advisory council to be more proactive in getting thoughts on our work and our directions. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;This advisory council has some key community folks participating:&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Eric Evans - &lt;/SPAN&gt;&lt;A href="http://www.domainlanguage.com/about/ericevans.html"&gt;&lt;SPAN style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;http://www.domainlanguage.com/about/ericevans.html&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Stephen Forte - &lt;/SPAN&gt;&lt;A href="http://www.stephenforte.net/"&gt;&lt;SPAN style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;http://www.stephenforte.net/&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Martin Fowler - &lt;/SPAN&gt;&lt;A href="http://martinfowler.com/"&gt;&lt;SPAN style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;http://martinfowler.com/&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Pavel Hruby - &lt;/SPAN&gt;&lt;A href="http://www.phruby.com/"&gt;&lt;SPAN style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;http://www.phruby.com/&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Jimmy Nilsson - &lt;/SPAN&gt;&lt;A href="http://jimmynilsson.com/"&gt;&lt;SPAN style="FONT-SIZE: 12pt; COLOR: blue; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;http://jimmynilsson.com/&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;3: We intend to drop more frequent interim builds. These builds will be unsupported interim builds where people can see what we have rolled into the product earlier and more often. We are still working the logistics of this out. &lt;BR&gt;4: For our internal development we will be doing significantly shorter iterations. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;We had quite long milestones in Orcas which made it more difficult to respond to customer feedback, and we hope that the transparent design process, the advisory council and the frequent drops will give us more feedback, and that with shorter iterations we will be more capable of responding.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt; LINE-HEIGHT: normal; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"&gt;&lt;SPAN style="FONT-SIZE: 12pt; FONT-FAMILY: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman'"&gt;Here is the thing though, even though we attempt to address the feedback, we know we won’t get everything. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;From a product ownership perspective it pains me greatly to read the “no confidence” letter. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;Especially as we have spent so much of the last couple of months working internally on how we can get better. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;It is ironic that we find out about this letter the same week that we were already planning to roll out our goals for our engineering process for this next release, but such is life. Many of the signatories have given us great feedback, and I only hope that they will continue to do so as we proceed. &lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 5pt 0.5in"&gt;&lt;o:p&gt;&lt;FONT face=Calibri size=3&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8647876" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>Databinding with ADO.NET Entity Framework</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2006/11/11/databinding-with-ado-net-entity-framework.aspx" /><id>http://blogs.msdn.com/timmall/archive/2006/11/11/databinding-with-ado-net-entity-framework.aspx</id><published>2006-11-11T19:45:56Z</published><updated>2006-11-11T19:45:56Z</updated><content type="html">                     &lt;div class=Section1&gt;  &lt;p class=MsoNormal&gt;So,&lt;/p&gt;  &lt;p class=MsoNormal&gt;&amp;nbsp;&lt;/p&gt;  &lt;p class=MsoNormal&gt;I am a self-admitted &amp;#8220;value layer&amp;#8221; bigot. I spend a lot of my coding time in ADO.NET Entities building stuff on top of our value layer (in other words working directly against Entity Client without using our object abstractions). Recently however I have been having a lot of fun writing apps at the Object Layer. One thing that I found I needed to do to make my life easier is have a more general purpose data binding solution until we have our production data binding support in place. For what it&amp;#8217;s worth our next CTP should have data binding in place so my post today should not be relevant after that.&lt;/p&gt;  &lt;p class=MsoNormal&gt;&amp;nbsp;&lt;/p&gt;  &lt;p class=MsoNormal&gt;Anyway&amp;#8230; I decided that what I would do is derive from BindingList&amp;lt;T&amp;gt; and have a trivial binding list implementation that was aware of our Entities and our ObjectContext to make my life a little easier&amp;#8230; not much code but here goes:&lt;/p&gt;  &lt;p class=MsoNormal&gt;&amp;nbsp;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; Trivial extension of BindingList&lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt; for working with Entities&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;class&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;EntityBindingList&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style='color:#2B91AF'&gt;BindingList&lt;/span&gt;&amp;lt;T&amp;gt; &lt;span style='color:blue'&gt;where&lt;/span&gt; T : &lt;span style='color:#2B91AF'&gt;Entity&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; reference an ObjectContext so that we can do saves &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;private&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;ObjectContext&lt;/span&gt; context;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; Constructor that takes an ObejctContext as an argument&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;param name=&amp;quot;context&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt;The current ObejctContext being used to interact with the persistent entities&lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;public&lt;/span&gt; EntityBindingList(&lt;span style='color:#2B91AF'&gt;ObjectContext&lt;/span&gt; context)&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style='color:blue'&gt;base&lt;/span&gt;()&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;this&lt;/span&gt;.context = context;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; Remove an item from the list, if the item is already attached to&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; the object context call DeleteObject so that when we save the context&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; this object is deleted from the store, if it is in the Detached state &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; just remove it from the list.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;param name=&amp;quot;index&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;protected&lt;/span&gt; &lt;span style='color:blue'&gt;override&lt;/span&gt; &lt;span style='color:blue'&gt;void&lt;/span&gt; RemoveItem(&lt;span style='color:blue'&gt;int&lt;/span&gt; index)&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:#2B91AF'&gt;Entity&lt;/span&gt; itemToRemove = &lt;span style='color:blue'&gt;this&lt;/span&gt;.Items[index];&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;if&lt;/span&gt; (itemToRemove.EntityState != &lt;span style='color:#2B91AF'&gt;EntityState&lt;/span&gt;.Detached)&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&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;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.DeleteObject(itemToRemove);&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&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;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;base&lt;/span&gt;.RemoveItem(index);&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; A save changes method that allows one&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; to save the changes in the list to the underlying &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; store. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; The assumption is that entities that have been retrieved&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; from the store were retrieved in a mode that stores them&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; in the state manager and that they are being change-tracked.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; As a result, all we need to do is add any detached entities (new rows)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; to the context and then invoke save changes.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;void&lt;/span&gt; SaveChanges()&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;foreach&lt;/span&gt; (&lt;span style='color:#2B91AF'&gt;Entity&lt;/span&gt; entity &lt;span style='color:blue'&gt;in&lt;/span&gt; &lt;span style='color:blue'&gt;this&lt;/span&gt;.Items)&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&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;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;if&lt;/span&gt; (&lt;span style='color:#2B91AF'&gt;EntityState&lt;/span&gt;.Detached == entity.EntityState)&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&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; context.AddObject(entity);&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&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;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.SaveChanges();&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; Helper method for loading a binding list from an IEnumerable&lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;T&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; T for this class is constrained to be an Entity or specialization&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:gray'&gt;///&lt;/span&gt;&lt;span style='color:green'&gt; &lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;param name=&amp;quot;entities&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style='color:green'&gt;The entities we want loaded into the binding liste&lt;/span&gt;&lt;span style='color:gray'&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;public&lt;/span&gt; &lt;span style='color:blue'&gt;void&lt;/span&gt; Load(&lt;span style='color:#2B91AF'&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; entities)&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;foreach&lt;/span&gt; (T entity &lt;span style='color:blue'&gt;in&lt;/span&gt; entities)&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&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;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;this&lt;/span&gt;.Add(entity);&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&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;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;With this class I can now use object data sources with little additional coding&amp;#8230; for example consider the following code:&lt;/p&gt;  &lt;p class=MsoNormal&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; &lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.5in;text-indent:.5in'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:green'&gt;//--- create a new EntityBindinglist passing it the instance of our object context (in this case model)&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;this&lt;/span&gt;.customers = &lt;span style='color:blue'&gt;new&lt;/span&gt; &lt;span style='color:#2B91AF'&gt;EntityBindingList&lt;/span&gt;&amp;lt;&lt;span style='color: #2B91AF'&gt;Customer&lt;/span&gt;&amp;gt;(model);&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.5in;text-indent:.5in;text-autospace: none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:green'&gt;//--- Populate the binding list by executing the Customers query (a property on my generated object context)&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.5in;text-indent:.5in;text-autospace: none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:green'&gt;//--- Note that when I execute I use the MergeOption &amp;#8220;AppendOnly&amp;#8221; I have a new context instance and&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='margin-left:.5in;text-indent:.5in;text-autospace: none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:green'&gt;//--- want to add the retrieved instances to the state manager for state tracking and identity resolution&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;this&lt;/span&gt;.customers.Load(model.Customers.Execute(&lt;span style='color:#2B91AF'&gt;MergeOption&lt;/span&gt;.AppendOnly));&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&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;/p&gt;  &lt;p class=MsoNormal style='margin-left:.5in;text-indent:.5in;text-autospace: none'&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New";color:green'&gt;//--- set the datasource property of my CustomersBindingSource to my new binding list&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;this&lt;/span&gt;.CustomersBindingSrc.DataSource = customers;&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&amp;nbsp;&lt;/p&gt;  &lt;p class=MsoNormal&gt;To save the changes by wiring up &amp;#8220;save&amp;#8221; functionality from a binding navigator I provide a save event handler for the save button:&lt;/p&gt;  &lt;p class=MsoNormal&gt;&amp;nbsp;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&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; &lt;span style='font-size:10.0pt;font-family:"Courier New";color:blue'&gt;private&lt;/span&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt; &lt;span style='color:blue'&gt;void&lt;/span&gt; saveToolStripButton_Click(&lt;span style='color:blue'&gt;object&lt;/span&gt; sender, &lt;span style='color:#2B91AF'&gt;EventArgs&lt;/span&gt; e)&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt; font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:blue'&gt;this&lt;/span&gt;.customers.SaveChanges();&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&lt;span style='font-size:10.0pt;font-family:"Courier New"'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p class=MsoNormal&gt;&amp;nbsp;&lt;/p&gt;  &lt;p class=MsoNormal&gt;That&amp;#8217;s about it&amp;#8230;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;/p&gt;  &lt;/div&gt;    &lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1059075" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>ADO.NET Entities in Orcas CTP</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2006/11/11/ado-net-entities-in-orcas-ctp.aspx" /><id>http://blogs.msdn.com/timmall/archive/2006/11/11/ado-net-entities-in-orcas-ctp.aspx</id><published>2006-11-11T19:15:00Z</published><updated>2006-11-11T19:15:00Z</updated><content type="html">&lt;P&gt;The latest Orcas CTP has ADO.NET Entities available and we have posted some &lt;A class="" href="http://www.microsoft.com/downloads/details.aspx?familyid=c14c451d-7043-44f0-87d7-845f1c238d64&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?familyid=c14c451d-7043-44f0-87d7-845f1c238d64&amp;amp;displaylang=en"&gt;samples&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;The bits available with the Orcas CTP do not have LINQ support or out of the box tooling, if you want LINQ support then you should pull our &lt;A class="" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=B68F6F53-EC87-4122-B1C8-EE24A043BF72&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=B68F6F53-EC87-4122-B1C8-EE24A043BF72&amp;amp;displaylang=en"&gt;August CTP&lt;/A&gt; and &lt;A class="" title="Tools Prototype" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=74bda7b2-9ca9-4eea-a33f-31942ddc9dbe&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyID=74bda7b2-9ca9-4eea-a33f-31942ddc9dbe&amp;amp;displaylang=en"&gt;Tools&lt;/A&gt;.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1059027" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>ADO.NET CTP</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2006/08/21/710875.aspx" /><id>http://blogs.msdn.com/timmall/archive/2006/08/21/710875.aspx</id><published>2006-08-21T19:04:00Z</published><updated>2006-08-21T19:04:00Z</updated><content type="html">&lt;P&gt;We shipped our CTP last week (&lt;A href="http://blogs.msdn.com/adonet/archive/2006/08/15/701479.aspx"&gt;ADO.NET August CTP&lt;/A&gt;). Pretty cool. I guess I should blog some on things like EDM, Metadata, Mapping and the like. For now I will point out some interesting blogs:&lt;/P&gt;
&lt;P&gt;Murali&amp;nbsp;made a large &lt;A href="http://blogs.msdn.com/adonet/archive/2006/08/21/710862.aspx"&gt;post&lt;/A&gt;&amp;nbsp;on &lt;A href="http://blogs.msdn.com/adonet/archive/2006/08/21/710862.aspx"&gt;queries&lt;/A&gt; &lt;BR&gt;There's the &lt;A href="http://channel9.msdn.com/showpost.aspx?postid=217633"&gt;channel 9 video&lt;/A&gt; if you have not seen it yet&lt;BR&gt;Ther's the &lt;A href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=533&amp;amp;SiteID=1"&gt;ADO.NET Forum&lt;/A&gt; where people are asking questions&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=710875" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry><entry><title>New post and screencast from Shyam...</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/timmall/archive/2006/06/21/642334.aspx" /><id>http://blogs.msdn.com/timmall/archive/2006/06/21/642334.aspx</id><published>2006-06-22T06:16:00Z</published><updated>2006-06-22T06:16:00Z</updated><content type="html">&lt;P&gt;Shyam Pather, a dev lead on the ADO.NET effort just posted on the &lt;A href="http://blogs.msdn.com/dataaccess/archive/2006/06/22/642260.aspx"&gt;Data Access Blog&lt;/A&gt; he has done some screencasts with our current bits:&lt;/P&gt;
&lt;LI&gt;&lt;A href="http://datajunkies.net/screencasts/adonet_vnext_part1/adonet_vnext_part1.html"&gt;&lt;STRONG&gt;&lt;FONT color=#006bad&gt;Part 1&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://datajunkies.net/screencasts/adonet_vnext_part2/adonet_vnext_part2.html"&gt;&lt;STRONG&gt;&lt;FONT color=#006bad&gt;Part 2&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/A&gt; 
&lt;P&gt;enjoy...&lt;/P&gt;&lt;/LI&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=642334" width="1" height="1"&gt;</content><author><name>timmall</name><uri>http://blogs.msdn.com/members/timmall.aspx</uri></author></entry></feed>