Tuesday, October 20, 2009

Change Entity Data Model at Runtime

Why

  • Use the same EDM in different environments (Dev, Test, Production etc.) that have different database schema.
  • Use the same EDM for different database systems (both SQL Server Compact Edition and SQL Server)

How

Entity Framework ObjectContext stores metadata in MetadataWorkspace property. We can load the meta into a MetadataWorkspace when application start, and then create ObjectContext using these two constructors:

Example

Following code demonstrates changing storage DB schema for using the EDM generated from SQL Server on SQL CE.
Assembly edmAssembly = Assembly.GetExecutingAssembly();

XmlReader metaReader = XmlReader.Create(edmAssembly.GetManifestResourceStream("EDM.ssdl"));
XElement ssdl = XElement.Load(metaReader);
//change Provider
ssdl.Attribute("Provider").Value = "System.Data.SqlServerCe.3.5";
ssdl.Attribute("ProviderManifestToken").Value = "3.5"; …

//EF for SQL CE 3.5 SP1 doesn’t support server generated column, location the XElement and change the attribute …element.Attribute("StoreGeneratedPattern").Value = "None";


List<XmlReader> r= new List<XmlReader>();
r.Add(ssdl.CreateReader());
StoreItemCollection sic = new StoreItemCollection(r);
r[0] = XmlReader.Create(edmAssembly.GetManifestResourceStream("EDM.csdl"));
EdmItemCollection eic = new EdmItemCollection(r);
r[0] = XmlReader.Create(edmAssembly.GetManifestResourceStream("EDM.msl"));
StorageMappingItemCollection smic = new StorageMappingItemCollection(eic, sic, r);

MetadataWorkspace
workspace = new MetadataWorkspace();
workspace.RegisterItemCollection(eic);
workspace.RegisterItemCollection(sic);
workspace.RegisterItemCollection(smic);

Only one instance of MetadataWorkspace is needed for a EDM in a application.

References

No comments:

Post a Comment