7 Stimmen

Wie konfiguriere ich DbContext für die Zusammenarbeit mit Oracle ODP.Net und EF CodeFirst?

Ich versuche, mit EF CodeFirst unter Oracle mit ODP.net zu arbeiten. Dies ist meine DbContext-Klasse:

    public class MyCEContext : DbContext {

    public DbSet<Person> Persons { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<Person>().ToTable("PERSONS","myce");

    }

    public MyCEContext() : 
        base(new OracleConnection(
            "Data Source=cebd; User ID=myce; Password=****;"), true) {}

}

Das Problem ist, dass, wenn ich versuche, etwas wie dieses zu tun:

MyCEContext context = new MyCEContext();
Person p = context.Persons.Find(1);

Ich erhalte diesen inneren Fehler:

{"ORA-00942: table or view does not exist"}

Und die Tabelle existiert.

Was mache ich falsch?

7voto

fcaldera Punkte 584

Wie Nick in seiner Antwort schrieb, hängt das Problem mit den Anführungszeichen und der Groß-/Kleinschreibung der generierten Abfrage zusammen, aber nicht mit den Tabellennamen, sondern mit dem Namen des Schemas:

SELECT * 
FROM "myce"."PERSONS" "Extent1"

Die Lösung ist also ganz einfach: Die Benutzerkennung und der Schemaname müssen in Großbuchstaben geschrieben werden:

modelBuilder.Entity<Person>().ToTable("PERSONS","MYCE");

Im Allgemeinen muss alles in Großbuchstaben geschrieben werden: Tabellen, Schema und Feldnamen. Es ist jedoch besser, jede zugeordnete Eigenschaft mit dem Attribut "Spalte" zu versehen, anstatt den Eigenschaftsnamen in Großbuchstaben zu schreiben:

    [Column("FIRST_NAME")]
    public string FirstName { get; set; }

Dadurch werden die Namen sowohl in der Datenbank als auch in den Klassen leichter zu lesen sein.

3voto

Nick Punkte 1098

Ihr Problem liegt höchstwahrscheinlich daran, dass EF die Abfrage in Anführungszeichen an Oracle weitergibt, was bedeutet, dass die Groß- und Kleinschreibung Ihrer Tabellen und Felder mit der der Datenbank übereinstimmen muss.

Wenn Sie also Folgendes hätten:

select name from persons;

Der EF-Code wird wahrscheinlich das folgende SQL abfeuern:

select "NAME" from "PERSONS";

Fügen Sie dies zu Ihrer OnModelCreating-Funktion hinzu:

modelBuilder.Conventions.Remove<ColumnTypeCasingConvention>();

...und konstruieren Sie Ihr POCO-Objekt mit Eigenschaftsnamen in Großbuchstaben anstelle der normalen Großschreibung.

Wenn Sie das SQL sehen wollen, brechen Sie den Code auf und sehen Sie sich das Objekt DbContext.Persons an. Sie sollten den tatsächlichen SQL-Befehl sehen, mit dem die gesamte Tabelle abgefragt wird (ziemlich groß)

Hinweis

Wir verwenden Oracle EF Code First in der Produktion. Obwohl es nicht offiziell unterstützt wird, scheint in der neuesten ODAC-Version nichts zu fehlen, was Sie daran hindern würde.

1voto

Barry Punkte 91

Sie können ToString für die Linq-Abfrage aufrufen, die Sie gegen Ihr dbcontext-Objekt ausführen. Dadurch wird das generierte SQL angezeigt. Das sollte Ihnen helfen, das Problem zu finden

Mein Problem war ein zweifaches:

  1. Meine Tabellennamen wurden pluralisiert
  2. Meine Tabellennamen wurden mit "dbo." eingeleitet.

0voto

Wenn Sie nicht jede Spalte Ihrer Anwendung als Workaround für das von @fcaldera erwähnte Quoting-Problem mappen wollen, können Sie den Provider "Devart's dotConnect for Oracle" verwenden.

Dazu ist lediglich der folgende Code erforderlich:

var config = Devart.Data.Oracle.Entity.Configuration.OracleEntityProviderConfig.Instance;

config.Workarounds.DisableQuoting = true;

Jetzt können Sie eine Klasse "MyObject" ohne Probleme einer Tabelle MYOBJECT zuordnen. Und das gilt auch für die Spalten.

Anmerkung: Die NuGet-Version von "dotConnect for Oracle" unterstützt kein Entity Framework. Es ist notwendig, die Test- oder Professional-Version von der Devart-Website herunterzuladen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X