【问题标题】:使用 Entity Framework 6 在 Oracle db 19 中创建一个没有精度和规模的 NUMBER 列
【发布时间】:2022-01-23 14:31:20
【问题描述】:

我首先使用 EntityFramework 6.4.4 代码来创建数据库。我的数据库服务器是 Oracle 19C。我的数据库中的一个字段是货币字段(十进制),这个字段,我们称之为价格,大部分时间会乘以大十进制值,但有时也会乘以小值,所以我需要精确度和规模灵活适应所有值大小。

在旧系统中,该字段的数据类型为 NUMBER,但这是直接使用 PLSQL 设置的,现在无论我使用 EF6 (C#) 尝试什么,我都会不断收到 Number(18,2)

我在网上查了一下,发现from this article这是C#的十进制约定,而我may disable it

所以在我的代码中,我在AppDbContext 中禁用了它,如下所示:

using TestDB.Model;
using System.Data.Entity.ModelConfiguration.Conventions;

namespace TestDB
{
    public class MyDbModel : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
            .
            .
        }

但我现在得到的结果是 NUMBER(38,0),这是 Oracle 的默认值。

如何将字段的数据类型设置为NUMBER 而没有精确度和比例? 还是 EF6 不支持?

【问题讨论】:

    标签: c# database oracle entity-framework entity-framework-6


    【解决方案1】:

    不要禁用约定,而是使用显式列 configuration 覆盖它们。例如

    modelBuilder.Entity<MyEntity>().Property(x => x.Price).HasColumnType("NUMBER");
    

    【讨论】:

    • 不幸的是我已经尝试过了。如果DecimalPropertyConvention 未被禁用,它将提供约定默认的Number(18,2),否则使用Number(38,0)。由于我使用的是 EF6 而不是 EF Core,因此我已经尝试过 .HasPrecision。但在这里你总是必须包括精度和规模。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2021-02-05
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多