我有一个现有的Oracle 11g数据库。
我创建了一个新的解决方案和一个新项目(.net 4.5),我添加了以下NuGet包:
我的web.config指定了edmMappings的一个部分。
<oracle.manageddataaccess.client>
<version number="*">
<dataSources>
<dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
</dataSources>
<edmMappings>
<edmMapping dataType="number">
<add name="int64" precision="10" />
</edmMapping>
</edmMappings>
</version>
</oracle.manageddataaccess.client>
然后,我使用数据库的EF Designer(模型优先)添加一个新的ADO.NET实体数据模型。
我有一个表PROCESS
,其中LINK_ID
列在Oracle中定义为NUMBER(10)。
生成的.edmx文件和entites(通过tt文件生成)使用普通的int(Int32)而不是我的映射中指定的long(Int64)。
我希望生成的模型使用long。
我可以手动更改此设置,但是在运行时我收到以下错误:
指定的架构无效。错误:\ r \ nTestMappings2.msl(18,12): 错误2019:指定的成员映射无效。类型 成员'LINK_ID'的'Edm.Int64 [Nullable = True,DefaultValue =]' 'Model.PROCESS'与。不兼容 'OracleEFProvider.number [可空=真,默认值=,精密= 10,标度= 0]' 在'Model.Store.PROCESS'类型中的成员'LINK_ID'。
如何让生成的模型使用正确的类型?为什么更改类型会给我一个运行时映射错误?
答案 0 :(得分:3)
从docs.oracle.com开始,edmMappings语法已更改为指定最小和最大精度,而不是指定截止点。
<add NETType="int64" MinPrecision="10" MaxPrecision="19" DBType="Number" />
旧的语法是:
<add name="int32" precision="9" />
<add name="int64" precision="18" />