簡體   English   中英

EF 5.0 Oracle Code首先將Precision設置為數字類型

[英]EF 5.0 Oracle Code First set Precision to number types

使用Entity Framework 5.0和ODP.NET,我試圖為現有的Oracle數據庫首先構建代碼 DbContext。 我知道ODP並不正式支持這種方法,但是對於我仍然需要解決的唯一問題,也許有一種解決方法。

我所有的表都有類型為NUMBER(18,0) 這是一個簡單的示例:

  •  > DESCRIBE T_USER KUSER NOT NULL NUMBER(18,0) 
  • 域對象

     public class User { public long Id { get; set; } /* ... */ } 
  • 映射配置

     modelBuilder.Entity<User>() .ToTable("T_USER"); modelBuilder.Entity<User>() .Property<long>(x => x.Id) .IsRequired() .HasColumnType("number") .HasColumnName("KUSER"); 

我不能指定Precision屬性,因為只有DecimalPropertyConfiguration類(.Property())公開了Precision和Scale屬性。

結果是所有翻譯后的查詢都包含一個精度為19位的CAST AS號(Int64的默認映射),例如:SELECT CAST(“ Extent1”。“ KUSER” AS號(19,0))AS“ C1”,/ * ... * /

在JOIN和WHERE子句中執行相同的強制轉換,會對每個查詢產生嚴重的性能影響。

在EDMX XML文件中(我希望以后不再使用它,因此我已棄用該文件),我有以下一行:

<Property Name="KUSER" Type="number" Nullable="false" Precision="18" />

創建EF模型后是否可以手動設置屬性的Precision?

或者,也許有一種方法可以擴展EF配置類並添加自定義NumberPropertyConfiguration ,以公開Precision屬性。 Edm名稱空間是內部的事實使我無法繼續使用后者。

筆記

  • 我不能用C# decimal類型表示這些屬性,因為我將不得不重寫幾乎所有的域層。
  • 我不能添加偽造的long屬性來包裝隱藏的decimal ,因為在LINQ-to-SQL查詢聯接和選擇中需要使用long字段

更新

  • PrimitivePropertyConfiguration添加了對.HasColumnType("number")調用,但是結果是相同的。
  • 通過遍歷MetadataWorkspace來更改屬性方面是否可行?

     (this as IObjectContextAdapter).ObjectContext.MetadataWorkspace 

    我將自己盡快嘗試並更新結果。
    MetadataWorkspace是只讀的。

不,你不能那樣做。 如果您使用的是Code First,則模型由您的代碼定義。 如果您的代碼說一個屬性為long ,則該屬性不會在數據庫中映射為NUMBER()列。

我能想到的唯一直接的解決方法是您提到的那些,但您要避免。

您仍然可以使用映射器,例如AutoMapper更多信息 ,請參見 此處 ),該映射器允許您從EF實體映射到域實體。 根據您代碼的實現方式,此方法可以起作用,但是,如果您將EF LINQ功能泄漏到域邏輯中,則此方法將無效。 您可以嘗試使用AutoMapper IQueryable Extensions,但不確定它們是否適用於您的用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM