Entity Framework 4 + Self-Tracking Entities + ASP.NET Dynamic Data = Error

为君一笑 提交于 2019-12-24 15:05:37

问题


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, Func1 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!


回答1:


You need to add a reference to the assembly containing your entities to your web app.




回答2:


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.




回答3:


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);


来源:https://stackoverflow.com/questions/2282916/entity-framework-4-self-tracking-entities-asp-net-dynamic-data-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!