2012-04-04 216 views
3

目前,我有一个代码,第一种模式是这样的:实体框架4.1代码第一次和Oracle CLOB

public class Ticket 
{ 
    public int SERIAL_NO { get; set; } 
    public DateTime SUBMIT_DATE { get; set; } 
    public string SYNOPSIS { get; set; } 
    public string DESCRIPTION { get; set; } // This is really an Oracle CLOB in the DB 
} 

在售票控制器,当用户点击提交,我有选择的最大SERIAL_NO出来的数据库的,就像这样:

var lastSerial = db.Tickets.Select(x => x.SERIAL_NO).Max(); 

它抛出这个错误:

ORA-00932: inconsistent datatypes: expected - got NCLOB 

人有什么想法?提前致谢!

+0

其实,我认为你没有获取整个实体,只有SERIAL_NO。检查发送到数据库的实际SQL(请使用它更新您的问题)。确保数据库中的SERIAL_NO类型为int – surfen 2012-04-04 11:30:16

+0

这是发送到数据库的实际SQL。这是Linq。如果我从代码优先模型中删除DESCRIPTION字段,它不会中断。你是正确的,我只想在这种情况下SERIAL_NO,但虽然我几乎可以肯定,它是破坏性的,因为描述的数据类型不匹配那是数据库,我不知道如何转换它或使它比赛。 – 2012-04-04 12:06:44

+0

我明白了。出于某种原因,它试图加载实体并失败。它甚至不应该尝试用所提供的代码来做到这一点。顺便说一下,为什么在提交期间获取最后一个序列?如果你用这个来增加新的Ticket的id,那么这是一个不好的做法,因为当多个用户同时添加Tickets时,它会导致bug。你应该使用'Sequence'和'Trigger'来代替。 – surfen 2012-04-04 12:14:46

回答

1

ODP.NET的最新版本(在写这篇文章的时间)为11.2.0.3

不幸的是,这个版本还不支持代码优先(见Oracle® Data Provider for .NET Developer's Guide仅供参考)

Entity Framework 4.1 is supported. However, the Code First feature, that is part of Entity Framework 4.1, is not currently supported.

如果您愿意付款,DevArt claims that their provider supports Code-First。他们提供免费试用,所以你可以检查出来。

另一种选择是使用EDM Designer生成代码。

+0

虽然它在技术上不支持代码优先,但如果您并行编写模型和数据库并将模型指向连接字符串到数据库,一切都按预期工作,除了不幸的是,CLOB数据类型...我试图找到解决方法。 :-) – 2012-04-04 13:30:03

+0

我猜数据库优先自动生成的代码会支持clob的,所以也许你可以找到差异,并将一些自动生成的代码复制到Clob-WorkAround-Utility类中。似乎Oracle仍在致力于Code First,并且由于使用Clob等更高级功能的问题而不受支持。 – surfen 2012-04-04 13:36:29

+0

但我不认为这是一个好主意。你很快就会发现另一个不起作用的功能...... – surfen 2012-04-04 13:38:26

0

查询中的原始问题(获取ORA-00932错误)是因为当SELECT列表包含具有较大(例如CLOB)数据类型的字段时,不能使用DISTINCT。您生成的SQL是否包含DISTINCT子句并返回DESCRIPTION字段?它计算出,一个CLOB可能包含GB的数据,只返回它的不同列可能潜在地意味着在每个单独列上的GB与结果集中的GB或所有其他列进行比较。

我猜其他集合函数也会失败(min,max),并且按照顺序使用CLOB列,出于同样的原因。由于这是一个老问题,我给出的提示通常会解决大多数编码人员的“头部划伤”问题,所以我不会在SQL参考中查找相关位置。那些需要细节的人现在知道去哪里寻找(或寻找什么)。

0

对你模型,添加属性[StringLength(100)]

相关问题