【问题标题】:Using oracle sdo_geometry with EntityFramework 6.0 and .NET 4.5在 EntityFramework 6.0 和 .NET 4.5 中使用 oracle sdo_geometry
【发布时间】:2013-12-30 11:13:43
【问题描述】:

article 声明 EF 5.0+ 和 .NET 4.5 完全支持像 oracle sdo_geometry 这样的空间类型。但是,当我尝试导入带有几何图形的表时,出现此错误:

Data type 'sdo_geometry' not supported by .NET Framework

我已经检查过了,我在我的项目编译器选项中使用了 .NET 4.5。那我错过了什么?

【问题讨论】:

  • 您使用的是哪个数据库连接器?您链接的文章是关于 EF 的 dotConnect 数据提供程序。
  • 我使用的是 oracle 11g。现在我正在尝试 dotConnect 的试用版,但我认为 .NET 和 EF 5 支持空间数据,而无需使用其他商业工具
  • EF 确实支持空间类型,但正确实现它也取决于数据提供者。 SQL Server 的数据提供程序是内置并默认提供的,但对于其他数据库,您需要第三方工具来在 EF 的通用实现和特定于数据库的详细信息之间建立联系。
  • @ken2k 谢谢你的澄清!

标签: c# oracle entity-framework


【解决方案1】:

如前所述,ODP.NET 驱动程序当前不支持 SDO_GEOMETRY 类型。您也不能像在非托管驱动程序中那样使用用户定义类型 (UDT) 来处理几何图形。

以下是一些解决方法:

  1. 将托管驱动程序与非托管驱动程序并行使用(不是好主意)

  2. 按照注释使用备用数据提供程序(例如 dotConnect)

  3. 使用原始 SQL 和 Oracle SDO_UTIL

    // result = "POINT(30.1 - 21.9)"
    DbRawSqlQuery<string> result = 
      dbContext.Database.SqlQuery<string>("SELECT SDO_UTIL.TO_WKTGEOMETRY(COORDS) ...");
    
  4. 上述观点的变体,但使用命令拦截

    public class MyDbCommandInterceptor : IDbCommandInterceptor 
    {
      public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
      {
        if (command.CommandText.Contains("__MARKER__"))
        {
          // Do some funky text replacement
        }
      }
      ...
    }
    
    public partial class MyEntity 
    {
      [Column("__MARKER__COLUMNAME"]
      public string Coord { get; set; }
    }
    
    // Before you run the query:
    MyDbCommandInterceptor interceptor = new MyDbCommandInterceptor();
    DBInterception.Add(interceptor);
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多