Question

Notre organisation cherche à standardiser Entity Framework une fois v4 sort. En conséquence, je regarde ce qu'il faudrait pour migrer notre application qui utilise NHibernate pour la persistance à l'aide EF4 support POCO. Dans quelques endroits, nous utilisons l'héritage de table unique (également connu sous le nom de table par hiérarchie). Je suis incapable de le faire fonctionner en utilisant ce qui suit.

Paiement (classe de base [doit être abstraite, mais avoir du mal à y aussi bien]) CreditCardPayment (de mise en œuvre concrète) ACHPayment (de mise en œuvre concrète) CheckPayment (mise en œuvre concrète)

En ce moment, je les mapping avec seulement les propriétés de la classe de base. Toutes ces classes sont dans le même espace. Ils ont une discrimimator qui est appelé PaymentTypeId dans la base de données, la mise en correspondance de paiement a une condition de « Quand PaymentTypeId = 0 ». Chacune des sous-classes ont la même condition avec des valeurs différentes (à savoir CreditCardPayment = 1, etc.).

Lorsque je tente de charger chacune une liste de tous les paiements effectués par DataContext.Payments.ToList () (DataContext hérite de ObjectContext) Je reçois l'exception suivante:

« mapping objet n'a pas été trouvé pour le type d'identité « DataLayer.DataModel.CreditCardPayment ». »

Je ne peux pas comprendre ce que cela signifie, que la vie classe POCO CreditCardPayment dans le même espace que la classe POCO de paiement ne (en fait dans le même fichier).

Qu'est-ce que je manque?

Était-ce utile?

La solution 2

Ce que je ne représentais pas avant (je ne pensais pas pertinent, mais il était). Était-ce CreditCardPayment hérité d'une classe intermédiaire nommé « CreditPayment » et ACHPayment héritée de CashPayment. CreditCardPayment et CashPayment vivent dans le même espace et le fichier, mais ne sont pas représentés dans la cartographie EF. Une fois que j'ai ajouté les dans le fichier de mappage, tout fonctionnait bien.

Alors, même pensé EF ne, il ne semble pas toujours la carte à l'un de ces types directement besoin de savoir à leur sujet, car il change la basetype des classes CreditCardPayment et al. Nous vous remercions de votre aide à ce sujet.

Autres conseils

se plaint pas de mappage de base de données, mais le modèle de mappage CLR.

L'EF ne peut pas pour une raison quelconque trouver votre classe CreditCardPayment.

Une raison possible est que vous ne l'avez pas chargé les métadonnées encore.

Par exemple, si vous avez ceci:

Assembly 1:
 - Payment

Assembly 2 references Assembly 1:
 - CreditCardPayment extends Payment

Ensuite, lorsque vous interrogez l'EF ne sait pas où vit CreditCardPayment.

La façon de se déplacer est avec LoadAssembly i.e.:

using (DataContext ctx = new DataContext())
{
   ctx.MetadataWorkspace.LoadFromAssembly(typeof(CreditCardPayment).Assembly);

   // now do your query.

}

Vous devez dire à LoadFromAssembly chaque assemblée qui ne sont pas référence directement par votre classe DataContext.

Note:. typeof(Payment).Assembly est référencée directement à cause de la propriété de paiements IQueryable<Payment>

Hope this helps

Alex

Microsoft.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top