2010-05-07 74 views
4

我正在调查组织中实体框架的使用。我们使用Oracle数据库管理系统,因此(无论好坏)都使用Oracle常见的“伪布尔”模式,而不是使用布尔列(Oracle中不存在),而是使用一个带有检查的1字符列迫使它强制为“Y”或“N”。因此,如果我想让我的EF模型中的实体具有布尔属性,那么如何将此映射到数据库列,如“Y”为真,“N”为假?是否有一个“转换器”的概念或实体框架中的东西会为我做这件事?将实体框架与Oracle伪布尔值一起使用

仅仅因为它可能会出现,我知道EF只能用于SQL Server开箱即用。我将使用DevArt dotConnect for Oracle将EF与Oracle结合使用。
http://www.devart.com/dotconnect/oracle/

编辑
什么其他的ORM框架,比如NHibernate的?他们是否可以“开箱即用”处理这种情况?

回答

3

Devart dotConnect for Oracle自动将NUMBER(1)列映射到System.Boolean,它简化了这些列的工作 - 0对应于false,非零(默认为1) - 为true。不需要额外的操作。
如果您希望以char形式保留布尔值,则必须选择以下方法之一:
1.将属性的字符串类型保留为映射到字符列。 为部分实体类添加布尔类型的附加包装属性,并相应地将字符串值转换为布尔值,反之亦然。
缺点:该包装属性不能在LINQ to Entities中使用。
2.在表格上创建一个视图,该视图将返回0或1而不是来自角色列的值。作为替代方案,在此EntitySet的模型中创建一个DefiningQuery(在这种情况下,不应将其添加到数据库中)。在大多数情况下,需要将属性的类型从SSDL中的“char(1)”更改为“bool”,并将CSDL中的System.String更改为System.Boolean。您应该编写一组存储过程来与您的实体一起执行CUD操作,并将这些过程映射为可更新的实体。
缺点:很多工作。

+0

感谢您的回复。我考虑了这两个选项,但希望找到一种方法来获得与VARCHAR(1)相同的NUMBER(1)处理。这些选项的缺点对我们很重要。我们不能真正改变使用NUMBER(1)我们有100个使用VARCHAR(1)方法的表。 – RationalGeek 2010-05-07 17:50:23

1

感慨万分,Oracle没有官方的EDM-EF映射 - DevArt和DataDirect都有自定义的Oracle连接提供程序层,您可以购买。还有CodeProject上提供的准开源版本可以为EF w/Oracle实现EDM。我认为你正在使用其中之一。

要解决您的问题,您需要的是更改ProviderManifest实现,以便在调用GetEdmType()时返回适当的.NET类型。问题是这种方法传递给你一个Oracle类型,并期望你返回一个EF可以理解的.NET类型(它理解所有的原语,包括bool)。不幸的是,将CHAR(1)映射到布尔值是不可取的,因为原则上可以有其他CHAR(1)列,它们不是而是布尔值。

的解决此问题的是创建一个oracle user-defined type(JKBOOL,可以说:),映射到CHAR(1) - 那么你就必须改变你的表格来改变CHAR(1)JKBOOL。现在您可以安全地将JKBOOL映射到System.BooleanGetEdmType()

+0

有趣的东西,但如果我要在Oracle中创建一个用户定义类型并使用该类型代替CHAR(1),那么我可能只需使用NUMBER(1)来表示DevArt的EF提供程序已正确映射到bools的bools 。 – RationalGeek 2010-05-19 10:36:00

+1

不同之处在于UDT仍然可以被任何SQL或PLSQL代码视为“CHAR(1)” - 因为UDT只是该类型的别名。将列更改为“NUMBER”将是一个重大更改,需要分析哪些查询,包和视图会受到影响。 – LBushkin 2010-05-19 12:12:35

+0

啊。现在我明白你在说什么了。我一定会考虑这种可能性。谢谢(你的)信息。 – RationalGeek 2010-05-20 02:07:24

相关问题