[英]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名稱空間是內部的事實使我無法繼續使用后者。
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.