【问题标题】:Entity Framework generates short instead of int实体框架生成 short 而不是 int
【发布时间】:2012-09-09 14:25:58
【问题描述】:

我们将 Entity Framework 数据库优先用于我们的 Oracle 数据库。

由于某种原因,Number(5) 变为 Int16 - short

最大 Number(5) 值为 99999
最大Int16 值为 32767

问题...有没有办法指示映射器将Number(5) 翻译成int32

【问题讨论】:

    标签: c# .net oracle entity-framework ef-database-first


    【解决方案1】:

    解决了,添加到 web.config 中:

    <oracle.dataaccess.client>
    <settings>
    <add name="int16" value="edmmapping number(4,0)" />
    <add name="int32" value="edmmapping number(9,0)" />
    </settings>
    </oracle.dataaccess.client>
    

    使用*.edmx 文件重新创建模型并...

    现在Number(5)Int32 而不是Int16Number(10)Int64 而不是Int32

    希望以后能帮到别人……

    【讨论】:

    • 这对我有帮助!现在我已经重新生成了 edmx,我有了 Int32,但它不再编译,并且出现以下错误:Error 2019: Member Mapping specified is not valid. The type 'Edm.Int32[Nullable=True,DefaultValue=]' of member 'XX' in type 'Model.XXX' is not compatible with 'OracleEFProvider.number[Nullable=True,DefaultValue=,Precision=5,Scale=0]' of member 'XX' in type 'Model.Store.XXX'. 。有什么想法吗?
    • @wishper。我有同样的问题,但它确实编译!您遇到的那些错误不会使编译失败。我想如果你对 EDMX 和正在运行的应用程序使用相同的 DLL,你将不会得到这些/你能检查一下吗?谢谢。
    • 确实可以编译。但它只工作了一半。我可以加载数据,但在数据库中创建新数据失败。我对此提出了一个新问题:stackoverflow.com/questions/13311092/…
    【解决方案2】:

    对我来说,带有 EntityFramework 的 Oracle 总是导致我必须在生成 edmx 文件后应用一张更改表。

    除了更改列的数据类型之外,我建议在 edmx 文件中手动编辑行的类型,并记住这是您每次重新生成时都必须做的事情

    【讨论】:

    • 或者,不用记住,用一个单元测试来检查这个。
    • 1.有超过 100 列存在此问题。 2. 更改类型会导致错误,并且查询不再起作用。
    • 嗯,这很痛苦。更改数据库列大小不是一种选择?我几乎将所有数字列都更改为 Number(8,0) 以解决这个问题和另一个类似问题
    • 不是一个选项。不是我的电话(如果是我的话,我早就烧掉数据库了,所以...)
    • 我以前没有亲自这样做过,但是您应该能够在 XML 编辑器中打开 EDMX,以便获得标记并执行查找/替换以将所有对 short 的引用替换为诠释。基本上是一种无需使用设计器 UI 即可更改所有列类型的廉价快速方法
    【解决方案3】:

    对于Oracle.ManagedDataAccess.Client,我尝试了这项工作,并注意到顶部评论中的question

    <oracle.manageddataaccess.client>
        <version number="*"> 
          <edmMappings>
            <edmNumberMapping>
              <add NETType="int16" MinPrecision="2" MaxPrecision="4" DBType="Number" />
              <add NETType="int32" MinPrecision="5" MaxPrecision="9" DBType="Number" />
              <add NETType="int64" MinPrecision="10" MaxPrecision="19" DBType="Number" />
              <add NETType="bool" MinPrecision="1" MaxPrecision="1" DBType="Number" />
            </edmNumberMapping>
          </edmMappings>
        </version>
      </oracle.manageddataaccess.client>
    

    `

    【讨论】:

    • 很好的答案。只需从模型浏览器中删除实体类型,或直接从 .emdx 文件中删除
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多