C# EF 5.0 Oracle代码首先将精度设置为数字类型
通过EntityFramework5.0和ODP.NET,我正在尝试为我现有的Oracle数据库构建一个代码优先的DbContext。 我知道ODP并没有正式支持这种方法,但对于我仍然需要解决的唯一问题,可能有一个解决方法 我所有的表都有编号为18,0的键。这是一个简单的例子: 桌子 域对象C# EF 5.0 Oracle代码首先将精度设置为数字类型,c#,oracle,entity-framework,ef-code-first,C#,Oracle,Entity Framework,Ef Code First,通过EntityFramework5.0和ODP.NET,我正在尝试为我现有的Oracle数据库构建一个代码优先的DbContext。 我知道ODP并没有正式支持这种方法,但对于我仍然需要解决的唯一问题,可能有一个解决方法 我所有的表都有编号为18,0的键。这是一个简单的例子: 桌子 域对象 public class User { public long Id { get; set; } /* ... */ } 映射配置 modelBuilder.Entity<
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");
是否可以在创建EF模型后手动设置特性的精度
或者有一种方法可以扩展EF配置类并添加自定义NumberPropertyConfiguration
它公开了精度属性。
Edm名称空间是内部的这一事实阻止了我走后一条道路
笔记
我不能用C十进制类型表示这些属性,因为我必须重写几乎所有的域层。
我不能添加假long属性来包装隐藏的十进制属性,因为long字段需要在LINQ到SQL查询联接和select中使用
更新
在PrimitivePropertyConfiguration中添加了对.HasColumnTypenumber的调用,但结果相同。
通过遍历MetadataWorkspace更改属性方面是否可行
我会尽快亲自尝试并更新结果。
否,MetadataWorkspace是只读的
不,你不能那样做。如果您首先使用代码,则模型由您的代码定义。如果代码指出某个属性很长,则它不会映射为数据库中的数字列 我能想到的唯一直接解决办法就是你提到的那些,但你想避免
您仍然可以使用映射器,例如,它允许您从EF实体映射到域实体。这取决于代码的实现方式,但是,如果将EF LINQ功能泄漏到域逻辑中,那么这将不起作用。您可以尝试使用,但我不确定它们是否适用于您的用例。谢谢。我在我的领域逻辑中泄露了EF功能,因为我认为这是EF存在的全部意义。我将研究你提到的那些映射器,看看它们是否有帮助。我可以同意,有时将EF功能泄漏到域逻辑是有用且有效的。但这不是唯一的,也是最适合所有情况的。如果您展示IQueryable扩展是否适用于您的案例,那将非常有趣。我从未尝试过这种键列数据类型更改映射。我已经用我错过的细节和我希望的另一种可能的解决方案更新了这个问题。
modelBuilder.Entity<User>()
.ToTable("T_USER");
modelBuilder.Entity<User>()
.Property<long>(x => x.Id)
.IsRequired()
.HasColumnType("number")
.HasColumnName("KUSER");
<Property Name="KUSER" Type="number" Nullable="false" Precision="18" />
(this as IObjectContextAdapter).ObjectContext.MetadataWorkspace