2012-03-26 10 views
5

Ich habe ein Entity-Datenmodell erstellt und daraus eine Datenbank generiert.Ableiten von Klassen generiert von Entity Framework in C#

Eine der Entitäten heißt Template.

Erstellt teilweise Klassen zur Erweiterung der Funktionalität von Template funktioniert gut.

Wenn ich eine neue Klasse zu erstellen und versuchen, aus Template abzuleiten, erhalte ich eine Laufzeitausnahme auf Instanziierung:

Mapping and metadata information could not be found for EntityType 'Template001'.

Wie kann ich das umgehen? Ich muss definitiv von den EF-Klassen erben.

EDIT

Scheint nicht möglich. Wenn dies der Fall ist, was wäre der beste Weg, die folgende Anforderung zu implementieren: Die Template-Entität speichert Informationen über Vorlagen, die jeweils ihren eigenen Code zur Ausführung haben. Deshalb habe ich zuerst versucht, von der Entität abzuleiten.

+0

Auschecken [this] (http://stackoverflow.com/questions/2350514/ef-mapping-and-metadata-information-could-not-be-found-for-entitytype-error) und [this] (http://stackoverflow.com/questions/2247891/metadata-information-not-found-while-using-ef4s-poco-template) SO Fragen. – Attila

+0

Welche Art von "ihrem eigenen Code" haben Sie im Sinn, und wie sollte EF den Unterschied zwischen 'context.Template1s.Load()' und 'context.Template2s.Load()' verstehen, wenn die gesamte Datenbank es hat 'Vorlage'? Können Sie ein Beispiel dafür geben, wie Sie dies nutzen wollen? – hvd

+0

@Attila: Danke. Der erste Link erwähnt EF nicht unterstützt Enums, die ich übrigens in der partiellen Klasse verwendet wurde, aber das Entfernen funktioniert auch nicht. Bisher scheint es keine Lösung außer der Zusammensetzung zu geben. Irgendwelche Gedanken? –

Antwort

4

Warum müssen Sie zuerst von der Entitätsklasse erben? Wenn Sie ein einfaches Verhalten hinzufügen möchten, verwenden Sie partielle Klasse.

Update: Basierend auf Kommentaren scheint es, dass das Verhalten im Laufe der Zeit erweitert wird. In diesem Fall würde ich die Verwendung von Komposition/Aggregation und nicht Vererbung empfehlen. Lassen Sie die Klassen, die erweitert werden müssen, eine Entität als ein Feld haben. In Raheels Szenario wäre dies eine Klasse namens TemplateLogic mit Feld/Eigenschaft vom Typ Vorlage.

+0

Das Szenario ist schwer zu erklären, aber im Grunde implementiert jede abgeleitete Klasse benutzerdefinierte Funktionen, die im Laufe der Zeit zur Codebasis hinzugefügt werden. Die Entität selbst speichert einfach, welche Art abgeleiteter Klasse zur Verarbeitung verwendet werden soll. –

+4

Verwenden Sie dann einfach Komposition, nicht Vererbung. Lassen Sie die Klassen, die erweitert werden müssen, eine Entity als Feld haben. In Ihrem Szenario hätten Sie die Klasse TemplateLogic mit dem Feld/property des Typs Template. –

+0

Danke. Dies würde den Code ein wenig komplizieren, wird aber definitiv funktionieren. Wenn ich bald keine Antwort in der Erbschaft finde, werde ich damit enden. –

5

Es wird nicht unterstützt. Sie können keinen neuen Typ von einer Entität ableiten und ihn anstelle des zugeordneten Entitätstyps für die Persistenz verwenden. Wenn Sie eine abgeleitete Klasse von einer Entität erhalten möchten, müssen Sie eine zugeordnete Vererbung verwenden, bei der jedes Kind auch der Datenbank zugeordnet ist.

+0

Ich kann die abgeleiteten Klassen nicht zuordnen, da sie nicht für die Persistenz verwendet werden. Sie werden erstellt, um Funktionen abhängig von den zugrunde liegenden Entitätsdaten zu implementieren. –

+0

Nein, es funktioniert nicht so. Wenn Sie die Entität ableiten und sie entweder zum Abrufen von Daten aus der Datenbank oder zum Speichern von Daten in der Datenbank verwenden, wird sie für die Persistenz verwendet, und Sie müssen auch die abgeleitete Klasse zuordnen. Wenn Sie es nicht zuordnen können, bedeutet dies, dass Ihre Vererbung falsch verwendet wird und Sie die Komposition wie von @Sergey vorgeschlagen verwenden sollten. –