Entity Framework 5 - Enum-basierter Diskriminator für abgeleitete Klassen

8

Ich habe Folgendes (zur Verdeutlichung abgekürzt): eine Enumeration, eine Basisklasse mit dieser Enumeration und zwei abgeleitete Klassen, die die Enumeration auf einen bestimmten Wert setzen.

%Vor%

Was ich tun möchte, ist, dass Entity Framework 5 automatisch zwischen DerivedOne und DerivedTwo, mit einem MyEnum-basierten Diskriminator unterscheidet. Ich sollte in der Lage sein, dies zu tun, indem MyEnum == MyEnum.Value1 für DerivedOne und MyEnum == MyEnum.Value2 für DerivedTwo steht.

Ich habe das in meinem DbContext versucht:

%Vor%

Dies löst jedoch die folgende InvalidOperationException aus:

Der Ausdruck 'x = & gt; (Convert (x.MyEnum) == 0) 'ist kein gültiger Eigenschaftsausdruck. Der Ausdruck sollte eine Eigenschaft darstellen (...)

Bearbeiten: Ich glaube, ich habe ein wenig weiter damit gearbeitet:

%Vor%

Jetzt bekomme ich diese EntityCommandCompilationException:

Problem beim Abbilden von Fragmenten ab Zeile (...) Bedingung member 'MyBaseClass.MyEnum' mit einer anderen Bedingung als 'IsNull = False' ist zugeordnet. Entfernen Sie die Bedingung in MyBaseClass.MyEnum, oder entfernen Sie sie aus dem Mapping.

Irgendwelche Hinweise, wie ich das lösen kann? Danke!

    
Alex 07.04.2013, 06:06
quelle

3 Antworten

6

Soweit ich weiß, können Sie das nicht tun. Wenn Sie den expliziten Requires angeben, um den Disciminator anzugeben, geben Sie ihm nur name - um ihn nicht mit Ihrer Eigenschaft zu verbinden.

Soweit ich weiß, führt das immer zu dem Fehler (später), den Sie beschreiben. Wenn Sie einen Diskriminator angeben wollen, muss er 'automatisch' sein (zumindest habe ich es nie so definiert)

Aber das brauchst du wirklich nicht . Die 'Enum' und der Diskriminator ist built into der Typ, den Sie zurückbekommen - basierend auf den Diskriminatorwerten konstruiert EF / CF entweder 'Base' oder 'DerivedOne' oder DerivedTwo.

Um das zu implementieren, was Sie wollen, können Sie Folgendes tun ...

%Vor%

Oder benutzen Sie stattdessen is (wenn es für Sie funktioniert) ...

%Vor%

oder Abfrage nach ...

%Vor%     
NSGaga 07.04.2013 16:43
quelle
3

Ab EF 6.1 konnte ich trotz dieses Fehlers tatsächlich eine Enumeration als Diskriminatorspalte verwenden:

  

Weitere Informationen: Werte vom Typ 'MyEnum' können nicht als Typendiskriminatorwerte verwendet werden. Zu den unterstützten Typen gehören Byte, vorzeichenbehaftetes Byte, bool, int16, int32, int64 und string.

Alles was ich tun musste, war so etwas:

%Vor%

Also verwendete das Geheimnis (int)MyEnum.Value* anstelle von MyEnum.Value* ...

    
rsenna 05.06.2014 19:27
quelle
1

Basierend auf der Antwort von @rsenna, aber aktualisiert mit dem Mapping basierend auf der originalen Dokumentation von Microsofts Fluent Api.

Ссылка

%Vor%     
Ogglas 01.07.2017 20:29
quelle