2013-10-01 2 views
26

Ich verwende zuerst Entity Framework 5, DB. Ich weiß, wie ich eine Aufzählung in meinem Modell definieren und den Typ eines Feldes auf diese Aufzählung einstellen kann.So verwenden Sie eine vorhandene Enumeration mit Entity Framework DB Zuerst

Nun muss ich ein Feld MyField zu einer Aufzählung zuordnen, die extern definiert ist, d. H. Nicht im EF-Modell (OtherNamespace.MyEnum). Der Designer erlaubt mir nicht, den Typ auf etwas außerhalb des Modells einzustellen. Ich habe versucht, die Bearbeitung der edmx Datei manuell, aber das verursacht einen Fehler:

Error 10016: Error resolving item 'MyField'. The exception message is: 'Unresolved reference 'OtherNamespace.MyEnum'.'.

OtherNamespace.MyEnum wird von meinem Projekt verwiesen.

Wie machst du das?

+0

Ihr zu tun einige zusätzliche Logik zu haben, geht das bekommen, könnten Sie, dass in der Setter setzen. – Botonomous

+0

@Dunbar was meinst du? Kannst du genauer sein? –

+0

Wie im Property-Setter muss eine nicht zugeordnete Instanz des Objekts festgelegt werden, das Sie wirklich festlegen möchten. – Botonomous

Antwort

52

Dies kann getan werden, aber es erfordert ein wenig Opfer auf der Datenbankseite. Entity Framework (5 aufwärts) unterstützt das Zuordnen eines Feldes zu einer Aufzählung, sondern nur für byte, sbyte, short, ushort, int, uint, long oder ulong Typen.

wird angenommen, dass wir die folgende Beispieltabelle haben:

CREATE TABLE [People](
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    [Name] [varchar](50) NOT NULL, 
    [Title] [int] NOT NULL 
) 

Title wurde als Integer deklariert. In einer realen Datenbank könnte dies ein Fremdschlüssel für eine TitleTypes Tabelle sein.

Auch nehmen wir an, dass die externe Aufzählung, die wir in so definiert ist binden werden werden:

namespace Enumerations 
{ 
    public enum TitleEnum 
    { 
     Mr, 
     Mrs, 
     Dr, 
     None 
    } 
} 

Wenn wir die People Tabelle in eine EDMX importieren können wir direkt an der Säule Title klicken und konvertieren

Convert To Enum

ENUM

Dadurch wird ein Dialogfeld ermöglicht es uns, einen Namen für die Zählung in t angeben bringen Er EDMX ModelStore, definieren Sie beliebige Werte für die Enumeration ODER Link zu einer externen Enumeration über Referenz externen Typ.

Geben Sie einen Typnamen TitleEnum, überprüfen Sie Referenz externen Typ, und geben Sie Enumerations.TitleEnum in das Feld zur Verfügung gestellt. Klicken Sie auf OK, und die Spalte wird der externen Enumeration zugeordnet.

Hinweis:

  • Während beide TitleEnum genannt werden, diese an die externe Enumeration als Pass-Through handelt
  • Die Art Ihrer Spalte und die externe Aufzählung müssen übereinstimmen

Linking the Enumeration

Wenn wir nun eine neue Person erstellen, können wir die Aufzählung verwenden und sie wird in ihre Int-Repräsentation übersetzt.

Data.ScratchEntities context = new Data.ScratchEntities(); 
Data.Person person = new Data.Person(); 
person.Name = "Jane Smith"; 
//Note the use of the external enumeration here 
person.Title = Enumerations.TitleEnum.Mrs; 
context.People.Add(person); 
context.SaveChanges(); 

Intellisense

+1

Danke für eine schön dokumentierte Antwort. Aber es funktioniert nicht für mich. Bis zum letzten Schritt ist alles in Ordnung - aber ich erhalte einen Compilerfehler: Quellentyp 'Enumerations.TitleEnum' kann nicht zum Zieltyp' MyNamespace.TitleEnum' konvertiert werden. Was mache ich falsch? Könnte es sein, weil mein Basistyp "Byte" anstatt "Int" ist? –

+1

Ja. Der Typ der Spalte und der Basistyp für die Enumeration müssen übereinstimmen, damit eine implizite Konvertierung von einer in die andere durchgeführt werden kann. – cbeckner

+1

Die Spalte in der db ist eine Tinyint, die auf Byte ...? Und wenn das der Fall wäre, sollte eine explizite Besetzung funktionieren - aber das tut es nicht. –

Verwandte Themen