2015-03-26 10 views
10

Sto convertendo prima il DB EF5 nel codice EF6. nella vecchia configurazione ci sono alcuni FK che sono byte. e nell'applicazione sono mappati alle enumerazioni con il tipo di byte di sottolineatura. questo ha funzionato meravigliosamente.Una colonna di chiave esterna può essere un Enum nel codice Entity Framework 6 prima?

Passando prima al codice e EF6 ho trovato affermazioni che le enumerazioni dovrebbero "funzionare" e in effetti sembra essere il caso delle colonne regolari. Posso solo andare da questo

public byte FavPersonality {get;set;} 

a questo:

public Personality FavPersonality {get;set;} 

, ma quando si tratta di colonne che sono anche le chiavi esterne ottengo questo errore:

System.ArgumentException : The ResultType of the specified expression is not 
compatible with the required type. The expression ResultType is 'Edm.Byte' 
but the required type is 'Model.Personality'. 

È questo qualcosa che non può essere fatto prima con il codice EF6 +?

edit:

enum è definito come: byte

+1

L'enum è definito con ": byte" dopo il nome? –

risposta

1

Ho anche ottenuto l'errore:

The ResultType is MyEnum of the specified expression is not compatible with the required type 'Edm.Int32'. Parameter name: keyValues[0]

Quando si utilizza la mappatura di enumerazione:

[Column("MyActualFKColumnId", TypeName = "int")] 
public MyEnum MyEnum { get; set; } 

// NB : Foreign Key refers to the C# Property, not the DB Field 
[ForeignKey("MyEnum")] 
public MyEntityReferencedByEnum MyEntityReferencedByEnum { get; set; } 

Tuttavia, ero in grado di ovviare a quanto sopra ripristinando la chiave esterna intera originale (MyActualFKColumnId), Rimuovendo gli attributi [Column] e [ForeignKey], e quindi aggiungendo un hack [NotMapped] proprietà alla classe:

3

Ho appena incontrato lo stesso problema con il mio enum è un numero enum di base, ma questo si avvicinò come il primo risultato nella ricerca per messaggio. Ho avuto un sottotipo sul mio oggetto principale in cui i valori erano di un insieme fisso di valori. Ma c'erano anche degli oggetti per cui potevamo scrivere delle domande contro di loro.

public class Foo { 
    [Key] 
    public int Id { get; set; } 

    public BarEnum BarId { get; set; } 

    [ForeignKey(nameof(BarId))] 
    public Bar Bar { get; set; } 
} 

public class Bar { 
    [Key] 
    public int Id { get; set; } 
} 

public enum BarEnum { 
    Type1, 
    Type2 
} 

Questa configurazione mi ha dato lo stesso messaggio di errore come descritto in questa domanda:

The ResultType of the specified expression is not compatible with the required type. The expression ResultType is 'BarEnum' but the required type is 'Edm.Int'.

La risoluzione di questo è stato semplice: basta modificare l'ID di Bar di utilizzare l'enum pure, e tutto ha funzionato senza problemi Questo ha senso, in quanto ci sono lontano più valori possibili per un int di quello che ci sono per un BarEnum.

public class Bar { 
    [Key] 
    public BarEnum Id { get; set; } 
} 
+0

Sono passato un po 'di tempo e il mio codice non esiste più, se qualcuno può confermare che questo risponde alla domanda, lo contrassegnerò. – user1852503

+0

Non è un problema. Come ho detto, questo è stato il risultato migliore quando ho cercato il testo dell'errore. Cacciare tutti i posti in cui venivano usate chiavi esterne era un lavoro ingrato, ma una volta fatto, ha funzionato come un incantesimo. – krillgar

Problemi correlati