2010-01-03 5 views
4

J'utilise EF4 et j'ai deux entités que je souhaite mapper au mêmePOCO. Je ne suis pas sûr de savoir comment je peux faire ça.Entity Framework v4 -> besoin d'aide avec POCO et Entités

Entité 1 → Foo (ce qui représente une FOO de table dans la db)
POCO → Foo

Entité 2 → FooView (ce qui représente une FooView vue dans la db)
POCO → Foo

Je comprends que je dois faire quelque chose comme

IObjectSet<Foo> _foos = CreateObjectSet<Foo>(); 

// Note spelling of the Entity. 
IObjectSet<Foo> _foosView = CreateObjectSet<Foo>("FooViews"); 

Mais quand je tente cela, il ne compile, mais il échoue à l'exception suivante:

System.ArgumentException: System.ArgumentException: Le type d'entité spécifié, 'MyProject.Core.Foo', ne le fait pas correspond au type 'EntityFramework.SqlServerModel.FoosView' de l'EntitySet 'FoosViews'.

Des suggestions?

Répondre

3

Voici une liste de choses à rechercher:

  1. Votre modèle de stockage devrait avoir:
    1. Deux EntitySets: Foo et FooView
    2. Deux EntityTypes: Foo et FooView
  2. Votre Modèle conceptuel doit avoir:
    1. Deux EntitySets: Foo et FooView - deux avec un EntityType ensemble à ModelName.Foo
    2. Un EntityType: Foo
  3. Votre Mapping devrait avoir deux EntitySetMappings:
    1. Foo avec un EntityTypeMapping ("ModelName. Foo ") avec un MappingFragment (" Foo ")
    2. FooView avec un EntityTypeMapping ("ModelName.Foo ") avec un MappingFragment (" FooView ")

Vous devriez nouveau pouvoir exécuter les éléments suivants:

Foo foo = new ModelEntities() 
    .CreateObjectSet<Foo>("FooView") 
    .First(); 

Vous pouvez vous donner un bon départ en procédant comme suit:

  1. Ajouter Foo et FooView à votre modèle
  2. Dans le Mapping Details de Foo cliquez Add a Table or View et sélectionnez FooView
  3. Supprimer FooView de votre modèle
  4. Enregistrer le modèle et l'ouvrir dans l'éditeur XML
  5. (pre-RTM) Trouvez <EntityType Name="FooView"> dans <StorageModels> et supprimez toutes les entrées incorrectes à partir de <Key> (il doit correspondre <EntityType Name="Foo">)
  6. Enlever le <EntityTypeMapping Name="IsTypeOf(Foo)" /> et <EntityTypeMapping Name="IsTypeOf(FooView)" /> (le y me causait des erreurs)

À partir de bêta 2, la mise en œuvre de ce qui précède cassera le concepteur

+0

Salut Richard - Tas merci pour ce poste. Il y a beaucoup de données ici, donc je vais essayer de travailler le plus rapidement possible avant la fin du temps imparti. Dans votre première étape, dites-vous que je crée deux poco - l'un appelé 'Foo' et l'autre' FooView'? En outre, lorsque votre message parle de «types d'entités», est-ce que je fais référence à ma classe POCO? et 'plusieurs ensembles d'entités ', cela signifie mes * tables * qui sont sur mon concepteur (par exemple, table Foo et vue FooView)? –

+0

Dans mes exemples, je n'utilisais pas de POCO, mais le concept est le même. L'essentiel est de conserver deux ensembles d'entités distincts, et deux EntityTypes ** de stockage ** différents mais un seul ** EntityType conceptuel **. –

+0

Les EntityTypes conceptuels sont les mêmes que vos POCO. Stockage EntityTypes sont la représentation de la table de base de données. –

1

Dans NHibernate, il faut résoudre cela en utilisant Projections. Donc, je pense qu'il doit exister quelque chose de similaire à cela dans Entity Framework.J'ai googlé un peu, et je suis tombé sur ceci:

Questions connexes