4

我有以下簡單的實體:甲骨文ODP.Net和EF CodeFirst - edm.decimal錯誤

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

正如你所看到的,我不想從數據庫生成的ID,但我要去手動輸入。這是我的DbContext類:

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); 
    } 
} 

這裏沒有什麼特別的。但是這個代碼失敗:

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

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

這是錯誤:

指定的值類型不是「Edm.Decimal」

一般情況下,永諾EF嘗試發送一個實例值的int主鍵字段,我得到edm.decimal錯誤。

任何幫助?

+0

你有EF創建數據庫或者您正在使用CodeFirst與已經存在的數據庫? – Pawel 2012-04-12 03:45:36

+0

我對現有數據庫使用CodeFirst,但sice Oracle尚不支持數據庫創建。但桌子沒有什麼奇怪的。 ID字段是類型爲NUMBER(9)的主鍵。 – fcaldera 2012-04-12 17:05:11

+3

我不知道Oracle但是這張表http://docs.oracle.com/cd/E11882_01/win.112/e18754/featLINQ.htm顯示NUMBER類型可以映射到Edm.Decimal類型(我假設Number( 9)與數字(9,0)不同,因此屬於「其他情況」)。您可以通過轉儲edmx(EdmxWriter.WriteEdmx)並檢查Something實體的CSpace key屬性的EDM類型或將類中的類型更改爲Decimal來確認此操作是否可行。 – Pawel 2012-04-12 20:54:06

回答

4

正如我在前面的回答發表了評論,我已經找到更好的解決方案,很奇怪,但它的工作原理

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"); 
     } 

和TestEntity看起來像這樣

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

糾正我,如果我錯了,但你也應該能夠添加以下屬性到類定義中的Id屬性:[列(「ID」,TypeName =「INT」)] – 2012-10-26 14:44:35

+0

我沒有嘗試過,可能它也會起作用。但無論如何,我更喜歡使用Fluent API。 – msi 2012-10-26 20:00:29

+0

我想這就是爲什麼Fluent API在那裏,只是指出替代 – 2012-10-26 21:23:13