I just thought I should document what we learned in this thread here Entity Framework: Entity Model in a separated DLL first of all it is easy to do in Dynamic Data 4 and needs a fix on each page for Dynamic Data 1 (this version that shipped with Visual Studio 2008 SP1 and .Net 3.5 SP1)
Adding Model from DLL or Class Library
Figure 1 – sample project with Model in Class Library
To use the Northwind Model in our project we need to get a new instance of the Northwind context, to do this we could add the code to instantiate it in the Glabal.asax.cs file. But for me the object of having it in an external class library/DLL is to keep it reusable, so I had the idea of building the connection string in the external class library rather than locally. We add Listing 1 to the class library, as a partial class of the NorthwindEntities class, pass-in the server name (we could pass-in more but the server name will do here).
public partial class NorthwindEntities { /// <summary> /// Gets a new NorthwindEntities object. /// </summary> public static ObjectContext GetContext(String server, String database) { EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); entityBuilder.Provider = "System.Data.SqlClient"; entityBuilder.ProviderConnectionString = String.Format("server={0};database={1};Integrated Security=SSPI;MultipleActiveResultSets=True", server, database); entityBuilder.Metadata = @"res://*"; var objContext = new NorthwindContext.NorthwindEntities(entityBuilder.ToString()); return objContext; } }
Listing 1 – GetContext helper method
So now all we need to add this to our Dynamic Data app is use this in the RegisterContext method in the Global.asax.cs
DefaultModel.RegisterContext(() => NorthwindContext.NorthwindEntities.GetContext("aragorn","Northwind"), new ContextConfiguration() { ScaffoldAllTables = true });
Listing 2 – Using the GetContext helper
Fixing it up to work in Original version of Dynamic Data
This work beautifully in Dynamic Data 4, but not in the previous release we need the fix mentioned in Rick Andersons post
GridDataSource.ContextCreating += delegate(object ceSender, EntityDataSourceContextCreatingEventArgs ceArgs) { ceArgs.Context = (ObjectContext)table.CreateContext(); };
Listing 3 – Fix for Dynamic Data 1
Added to the List page it looks like this:
protected void Page_Init(object sender, EventArgs e) { DynamicDataManager1.RegisterControl(GridView1, true /*setSelectionFromUrl*/); GridDataSource.ContextCreating += delegate(object ceSender, EntityDataSourceContextCreatingEventArgs ceArgs) { ceArgs.Context = (ObjectContext)table.CreateContext(); }; }
Listing 4 – Added to List page template
You have to add this to each page template and add it twice on the ListDetails page template.
4 comments:
Really appreciate your post ! It helps me a lot !
Your welcome :)
Steve
Hey Steve,
Nice post! I've been trying to define the metadata in a different project with the same namespace as of the Entity Context. but can't get it to working, any thoughts on this?
Hi there, this is not possible using a buddy/metadata class, I do have a solution on my blog for stiring metadata in the DB which would allow this.
Steve
Post a Comment