2010-02-17 5 views
1

J'utilise l'option codegen Entités Self-Tracking dans EF4 (VS2010 RC), et j'essaie d'utiliser Dynamic Data pour construire rapidement site Web sale pour l'édition. Les fichiers Entities, Data Context et EDMX sont tous dans des assemblages séparés, et ce modèle fonctionne bien lorsque j'appelle tout dans le code. Mais quand j'essaie de l'utiliser avec des données dynamiques, tout de suite, je reçois tout un tas FAIL:Entity Framework 4 + Entités Self-Tracking + ASP.NET Dynamic Data = Erreur

Impossible de trouver le type CLR pour 'Core.Recording'. à System.Data.Metadata.Edm.MetadataWorkspace.GetObjectSpaceType (StructuralType edmSpaceType) à System.Web.DynamicData.ModelProviders.EFDataModelProvider.GetClrType (EntityType entityType) à System.Web.DynamicData.ModelProviders.EFDataModelProvider.CreateTableProvider (EntitySet EntitySet , EntityType entityType) à System.Web.DynamicData.ModelProviders.EFDataModelProvider..ctor (Object contextInstance, Func 1 contextFactory) at System.Web.DynamicData.ModelProviders.SchemaCreator.CreateDataModel(Object contextInstance, Func 1 ContextFactory) à System.Web.DynamicData.MetaModel.RegisterContext (Func`1 ContextFactory, la configuration du ContextConfiguration) à SimpleAdmin .Global.RegisterRoutes (routesCollection routes) dans D: \ SimpleAdmin \ Global.asax.cs: ligne 32 à SimpleAdmin.Global.Application_Start (Object expéditeur, EventArgs e) dans D: \ SimpleAdmin \ Global.asax.cs: ligne 61

RegisterRoutes ressemble à ceci:

DefaultModel.RegisterContext((() => new DataContext.Entities()), new ContextConfiguration() { ScaffoldAllTables = true }); 

Le constructeur par défaut sur le contexte a été modifié pour utiliser ma ma chaîne de connexion, qui ressemble à ceci:

<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"/> 

J'imagine que je suis ne référençant pas correctement les espaces O, C ou CS dans la chaîne de connexion ... mais cela fonctionne très bien si j'appelle le contexte dans le code et l'utilise. Alors qu'est-ce que je fais mal?

Merci!

Répondre

1

En fait, j'ai trouvé une solution réalisable. Il provient de ce post: http://thedatafarm.com/blog/data-access/wcf-data-services-and-ef-pocos-that-are-in-their-own-assembly/

Comme je n'utilise le site Dynamic Data que pour un administrateur rapide et non pas un site de production orienté client, je ne suis pas concerné par les problèmes de perf présentés dans le scénario. J'ai donc ajouté un constructeur qui ne DynamicData utiliserait:

public Entities(bool dynamicData) 
    : base(ConfigurationManager.ConnectionStrings["Entities"].ConnectionString, ContainerName) 
{ 
    Initialize(); 
    var tracestring = this.CreateQuery<Address>("Entities.Addresses").ToTraceString(); 
} 

puis, dans Global.asax.cs fonction de RegisterRoutes, j'ai maintenant ceci:

DefaultModel.RegisterContext((() => new DataContext.Entities(true)), new ContextConfiguration() { ScaffoldAllTables = true }); 

Works comme indiqué. Un peu irritant. mais chaque plate-forme doit avoir des mods qui ne jouent pas bien ensemble, non?

HTH.

+0

J'ai essayé ceci et j'obtiens l'exception "match ambigu" sur la méthode RegisterContext ... –

1

Vous devez ajouter une référence à l'assembly contenant vos entités dans votre application Web.

+0

ont déjà toutes les références nécessaires. – AdvancedREI

+1

Vous dites que vous faites, mais votre pile dit que vous ne le faites pas. Peut être l'une des autres assemblées? –

+0

Vous pouvez avoir toutes les bonnes références de projets et dll dans votre dossier bin, mais ObjectContext peut toujours échouer à trouver le type à l'exécution à moins qu'il n'ait été chargé dans ses métadonnées. – Mant101

0

Si vous connaissez l'assembly qui contient les classes POCO et ont ObjectContext vous pouvez utiliser ce qui suit pour charger les informations dans les métadonnées pour éviter l'erreur:

objectContext.MetadataWorkspace.LoadFromAssembly(assemblyWithPocos);