代码之家  ›  专栏  ›  技术社区  ›  RationalGeek

实体框架与oracle伪布尔函数的结合

  •  4
  • RationalGeek  · 技术社区  · 14 年前

    我正在调查实体框架在我的组织中的使用。我们使用oracle数据库管理系统,因此(无论是好是坏)使用oracle中常见的“伪布尔”模式,其中不是有一个布尔列(oracle中不存在),而是有一个带有check约束的1字符列来强制它为“y”或“n”。

    所以,如果我想让ef模型中的一个实体有一个boolean属性,我该如何将其映射到一个数据库列中,用“y”表示true,用“n”表示false?实体框架中是否有“转换器”的概念或其他什么东西可以帮我做到这一点?

    仅仅因为它可能会出现,我知道ef只适用于现成的sql server。我将使用devart dotconnect for oracle将ef与oracle一起使用。
    http://www.devart.com/dotconnect/oracle/

    编辑
    其他orm框架比如nhibernate呢?他们处理这种“开箱即用”的场景吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Devart    14 年前

    Devart Dotconnect for Oracle将数字(1)列自动映射到系统。Boolean简化了对这些列的操作-0对应于false,非0(默认为1)对应于true。不需要其他操作。
    如果希望将布尔值保留为char形式,则必须选择以下方法之一:
    1。保留映射到字符列的属性的字符串类型。 向部分实体类添加一个布尔类型的附加包装器属性,并相应地在getter和setter中将字符串值转换为布尔值,反之亦然。
    劣势 :此包装器属性不能在linq to实体中使用。
    2。在表上创建一个视图,该视图将返回0或1,而不是字符列中的值。或者,在模型中为此EntitySet创建一个DefiningQuery(在本例中不应将其添加到数据库中)。在大多数情况下,需要在ssdl中将属性的类型从“char(1)”更改为“bool”,在csdl中将属性的类型从system.string更改为system.boolean。您应该编写一组存储过程来使用您的实体执行CUD操作,并将这些过程映射为可更新的实体。
    劣势 :很多工作。

        2
  •  1
  •   LBushkin    14 年前

    在resent,没有来自Oracle的正式EDM-EF映射-devart和datadirect都有自定义的Oracle连接提供程序层,您可以购买。codeproject也提供了准开源版本,这些版本实现了ef w/oracle的edm。我猜你在用这个。

    为了解决你的问题,你需要改变 ProviderManifest 在对的调用中返回适当的.NET类型的实现 GetEdmType() . 问题是,这个方法传递给您一个Oracle类型,并希望您返回一个EF可以理解的.NET类型(它可以理解所有原语,包括bool)。不幸的是,不希望绘制地图 CHAR(1) 对于布尔值,原则上可以有其他 字符(1) 列是 布尔人。

    解决此问题的方法是创建 oracle user-defined type (jkbool,比方说:),它被映射到 字符(1) -然后你必须改变你的表格来改变 字符(1) JKBOOL . 现在你可以安全地绘制地图了 JKBOOL System.Boolean 在里面 GETEDMyType() .