Entity Framework 4 + Self-Tracking Entities + ASP.NET Dynamic Data = Error
I'm using the Self-Tracking Entities codegen option in EF4 (VS2010 RC), and I'm trying to use Dynamic Data to build a quick-and-dirty website for editing. The Entities, Data Context, and EDMX files are all in separate assemblies, and this model works well when I call everything in code. But when I try to use it with Dynamic Data, right off the bat I get a whole lotta FAIL:
Could not find the CLR type for 'Core.Recording'.
at System.Data.Metadata.Edm.MetadataWorkspace.GetObjectSpaceType(StructuralType edmSpaceType)
at System.Web.DynamicData.ModelProviders.EFDataModelProvider.GetClrType(EntityType entityType)
at System.Web.DynamicData.ModelProviders.EFDataModelProvider.CreateTableProvider(EntitySet entitySet, EntityType entityType)
at System.Web.DynamicData.ModelProviders.EFDataModelProvider..ctor(Object contextInstance, Func1 contextFactory)
at System.Web.DynamicData.ModelProviders.SchemaCreator.CreateDataModel(Object contextInstance, Func
1 contextFactory)
at System.Web.DynamicData.MetaModel.RegisterContext(Func`1 contextFactory, ContextConfiguration configuration)
at SimpleAdmin.Global.RegisterRoutes(RouteCollection routes) in D:\SimpleAdmin\Global.asax.cs:line 32
at SimpleAdmin.Global.Application_Start(Object sender, EventArgs e) in D:\SimpleAdmin\Global.asax.cs:line 61
RegisterRoutes looks like this:
DefaultModel.RegisterContext((() => new DataContext.Entities()), new ContextConfiguration() { ScaffoldAllTables = true });
The default constructor on the Context has been modified to use my my connection string, which looks like this:
<add name="Entities" connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string="Data Source=xxxxxxxxxx;Initial Catalog=MyDB;Persist Security Info=True;User ID=xxxx;Password=xxxxxxx;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient"/>
I开发者_开发问答 imagine I'm not referencing the O, C, or CS spaces correctly in the connection string... yet it works just fine if I call the context up in code and use it. So what am I doing wrong?
Thanks!
You need to add a reference to the assembly containing your entities to your web app.
Actually, I found a workable solution. It stems from this post: http://thedatafarm.com/blog/data-access/wcf-data-services-and-ef-pocos-that-are-in-their-own-assembly/
Since I'm only using the Dynamic Data site for quick-and-dirty admin, and not as a customer-facing production site, I'm not concerned about the perf issues introduced in the scenario. So I added a constructor that only DynamicData would use:
public Entities(bool dynamicData)
: base(ConfigurationManager.ConnectionStrings["Entities"].ConnectionString, ContainerName)
{
Initialize();
var tracestring = this.CreateQuery<Address>("Entities.Addresses").ToTraceString();
}
then, in Global.asax.cs' RegisterRoutes function, I now have this:
DefaultModel.RegisterContext((() => new DataContext.Entities(true)), new ContextConfiguration() { ScaffoldAllTables = true });
Works as directed. Kinda irritating,. but every platform has to have mods that don't play nice together, right?
HTH.
If you know the assembly that contains the POCO classes and have the ObjectContext you can use the following to load up the information into the metadata to avoid the error:
objectContext.MetadataWorkspace.LoadFromAssembly(assemblyWithPocos);
精彩评论