Entity Framework 4.1 Code First和Oracle CLOB问题

3

目前我有一个类似于以下代码的Code-First模型:

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

有人有任何想法吗?提前感谢!


实际上,我认为您没有获取整个实体,只有SERIAL_NO。检查发送到数据库的实际SQL(请在问题中更新它)。确保数据库中的SERIAL_NO是int类型。 - surfen
这是实际发送到数据库的SQL。它是Linq。如果我从代码优先模型中删除DESCRIPTION字段,它就不会出错。你说得对,在这种情况下我只想要SERIAL_NO,但尽管我几乎可以确定它出错是因为DESCRIPTION的数据类型与数据库不匹配,但我不知道如何转换它或使其匹配。 - Kasey Krehbiel
我明白了。由于某种原因,它尝试加载实体并失败了。根据提供的代码,它甚至不应该尝试这样做。顺便问一下,在提交时为什么要获取最后一个序列号?如果您使用此来增加并获取新票证的ID,则这是一种不好的做法,因为当多个用户同时添加票证时,这将导致错误。您应该改用SequenceTrigger - surfen
是的,我知道。我简化了代码。我真正做的是创建一个类似于XXX-YYY-ZZZ-001的序列号,它仅在用户提交工单时检索与XXX-YYY-ZZZ相关的最新编号,即在将新工单保存到数据库之前获取最新的工单编号。 - Kasey Krehbiel
你使用的是哪个数据库提供程序?ODP.NET?DevArt?你能否添加一个从数据库生成的新模型,看看它的自动生成代码是否与你的不同(我的意思是数据类型)? - surfen
显示剩余3条评论
4个回答

2
在列的映射中。
.HasColumnType("CLOB")

1

在查询中出现ORA-00932错误的根本问题是,当SELECT列表包含具有大型数据类型(例如CLOB)的字段时,不能使用DISTINCT。你生成的SQL是否包含DISTINCT子句并返回DESCRIPTION字段?

这很容易理解,CLOB可能包含GB级别的数据,仅返回其中的不同列可能意味着需要将每个单独的列与结果集中所有其他列的GB进行比较。

我猜聚合函数(min、max)也会失败,同样地,由于相同的原因,在ORDER BY中使用CLOB列也会失败。由于这是一个旧问题,而且我给出的提示通常可以解决大多数编程人员的困惑,所以我不会在SQL参考文献中查找相关位置。那些需要详细信息的人现在知道去哪里查找(或者要查找什么了)。


1

在撰写本文时,ODP.NET 的最新版本是11.2.0.3。

不幸的是,该版本尚不支持 Code First(请参阅Oracle® Data Provider for .NET Developer's Guide以获取参考)。

支持 Entity Framework 4.1。但是,Entity Framework 4.1 的一部分——Code First 功能目前不受支持。

如果您愿意支付,DevArt声称他们的提供程序支持Code-First。他们提供免费试用,因此您可以进行检查。

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


虽然它在技术上不支持Code-First,但如果您将模型和数据库并排编写,并将模型指向连接字符串到数据库,除了不幸的CLOB数据类型外,一切都按预期工作...我正在尝试找到解决方法。 :-) - Kasey Krehbiel
我猜数据库优先自动生成的代码应该支持clob,所以你可以找到差异并将一些自动生成的代码复制到你的Clob-WorkAround-Utility类中。似乎Oracle仍在努力开发Code First,但由于使用Clob等更高级功能的问题而不受支持。 - surfen
我所有的属性在DDL文件中都被创建为NCLOB,我该如何更改? - Campinho
@Campinho 请详细说明 - 它与我的答案有什么关系?你是如何定义你的属性的?也许你应该发起一个新的问题? - surfen
@surfen 抱歉,如果还有其他问题。谢谢。 - Campinho
显示剩余2条评论

0
在你的模型上,添加属性 [StringLength(100)]。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接