2014-12-17 2 views
5

Ich habe dieses Modell:Entity Framework und String als NCLOB auf Oracle Db

public class Teacher 
{ 
    public int TeacherID { get; set; } 
    public string Name { get; set: } 
    public string Surname{ get; set; } 
} 

und wenn Modell Erster Lauf, es ist mein Lehrer Tisch und DbSet schafft, sondern auch für Vor- und Nachname (die Zeichenfolge sind) zuweist NCLOB-Typ in die Spalte. Nun, mit NCLOB-Typ kann ich einige Operationen wie Gleichheiten oder Unterscheidungen auf meiner Tabelle nicht tun ....

Wie kann ich MF erzwingen, um columntype auf varchar zu setzen?

Antwort

6

Ich habe es geschafft, das Problem zu lösen, um die maximale String-Länge in das Modell Einstellung

public class Teacher 
{ 
    public int TeacherID { get; set; } 

    [StringLength(255, MinimumLength = 3, ErrorMessage = "My Error Message")] 
    public string Name { get; set: } 

    [StringLength(255, MinimumLength = 3, ErrorMessage = "My Error Message")] 
    public string Surname{ get; set; } 
} 

Ohne die StringLength Orcale erstellt ein NCLOB-Feld, das bis zu 4 GB Daten enthalten kann.

Hinweis: Die maximale Länge für varchar ist 4000 Bytes, also können wir nicht mehr als 2000 als MaximumLenght (2 Byte pro Zeichen mit Unicode) gesetzt

+0

Ich habe ein int mit einem .ToString() in einer LINQ-Abfrage und es verwendet TO_NCLOB in der Abfrage, die erstellt wird. Gibt es eine Möglichkeit, das zu verhindern? – JonathanPeel

+0

@ JonathanPeel Wenn das int außerhalb der LINQ-Abfrage verfügbar ist, können Sie das int in eine lokale Zeichenfolgenvariable außerhalb von LINQ konvertieren und die Zeichenfolge in der LINQ-Abfrage verwenden. –

+0

Ich habe einen Weg gefunden, um Erweiterungsmethoden zu Oracle-Funktionen zu mappen, mit '[Function (FunctionType.BuiltInFunction," TO_CHAR ")]'. Ich habe dann eine 'int.ToChar()' erstellt, und es funktioniert wunderbar. – JonathanPeel

4

Try es explizit zu konfigurieren:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Teacher>().Property(x => x.Name).HasColumnType("varchar"); 
    modelBuilder.Entity<Teacher>().Property(x => x.Surname).HasColumnType("varchar"); 
} 

Siehe Documentation

+0

ich es geschafft habe es die ‚richtigen Weg‘ zu lösen. Ich werde die Antwort posten, danke aber trotzdem für die Mühe! – Andrea

+0

sollte nur 'varchar2' sein? – Toolkit