4

Ich habe die folgende einfache Einheit:Oracle ODP.Net und EF CodeFirst - edm.decimal Fehler

public class Something{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public int ID { get; set; } 
    public string NAME { get; set; } 
    public int STATUS { get; set; } 
} 

Wie Sie sehen können, ich will nicht die ID aus der Datenbank generiert wird, aber ich werde manuell eingeben. Dies ist meine DbContext-Klasse:

public class MyCEContext : DbContext { 
    ... 
    public DbSet<Something> Somethings { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     string dbsch = "myce"; 
     modelBuilder.Entity<Something>().ToTable("SOMETHING", dbsch); 
    } 
} 

Hier ist nichts besonderes. Aber dieser Code nicht:

  using (MyCEContext ctx = new MyCEContext()) { 
       Something t = new Something(); 
       t.ID= 1; 
       t.NAME = "TEST"; 
       t.STATUS = 100; 

       ctx.Somethings.Add(t); 
       ctx.SaveChanges(); 
      } 

Dies ist der Fehler:

Der angegebene Wert ist keine Instanz des Typs 'Edm.Decimal'

Im Allgemeinen Allways EF versuchen, eine senden Wert zu einem int Primärschlüsselfeld, bekomme ich den edm.decimal Fehler.

Irgendwelche Hilfe?

+0

Haben Sie EF die Datenbank erstellen haben Oder verwenden Sie CodeFirst mit einer bereits vorhandenen Datenbank? – Pawel

+0

Ich verwende CodeFirst mit einer vorhandenen Datenbank, da Oracle die Erstellung von Datenbanken noch nicht unterstützt. Aber der Tisch hat nichts komisches. Das ID-Feld ist der Primärschlüssel mit NUMBER (9) als Typ. – fcaldera

+3

Ich kenne Oracle nicht, aber diese Tabelle http://docs.oracle.com/cd/E11882_01/win.112/e18754/featLINQ.htm zeigt, dass der NUMBER-Typ dem Edm.Decimal-Typ zugeordnet werden kann (ich nehme Number (9) ist etwas anderes als Nummer (9,0) und fällt daher auf "andere Fälle"). Sie können dies bestätigen, indem Sie entweder edmx (EdmxWriter.WriteEdmx) und den EDM-Typ der CSpace-Schlüsseleigenschaft der Something-Entität prüfen oder den Typ in Ihrer Klasse in Decimal ändern, um zu sehen, ob es funktioniert. – Pawel

Antwort

4

Wie ich auf der vorherigen Antwort kommentiert habe ich eine bessere Lösung gefunden wird, ist es seltsam, aber es funktioniert

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 

      modelBuilder.Entity<TestEntity>().ToTable("TESTENTITY", "SCHEMENAME"); 
      modelBuilder.Entity<TestEntity>().Property(p => p.Id).HasColumnName("ID").HasColumnType("INT"); 
      modelBuilder.Entity<TestEntity>().Property(p => p.TestDateTime).HasColumnName("TESTDATETIME"); 
      modelBuilder.Entity<TestEntity>().Property(p => p.TestFloat).HasColumnName("TESTFLOAT"); 
      modelBuilder.Entity<TestEntity>().Property(p => p.TestInt).HasColumnName("TESTINT"); 
      modelBuilder.Entity<TestEntity>().Property(p => p.TestString).HasColumnName("TESTSTRING"); 
     } 

und TestEntity sieht wie folgt aus

public class TestEntity 
    { 
     public int Id{ get; set; } 

     public string TestString { get; set; } 

     public int TestInt { get; set; } 

     public float TestFloat { get; set; } 

     public DateTime TestDateTime { get; set; } 
    } 
+1

Korrigieren Sie mich, wenn ich falsch liege, aber Sie sollten auch das folgende Attribut zur Id-Eigenschaft in der Klassendefinition hinzufügen können: [Spalte ("ID", TypeName = "INT")] –

+0

Ich habe es nicht versucht wahrscheinlich wird es auch funktionieren. Aber ich bevorzuge sowieso die Fluent API. – msi

+0

Ich denke, das ist der Grund, warum die Fluent API da ist und nur auf die Alternative hinweist –

Verwandte Themen