我可以使用IQ的直接接口从Oracle数据库中查询行,但是在简单更新时遇到问题。我想知道我做错了什么,或者IQ是否无法处理我的特定Oracle表。
我的表的主键为NUMBER(22),这导致实体的Int64。该查询有两个数字列,我正在更新的列是一个CHAR,它是实体中的一个字符串。
这是我的更新......
var c = Components.Single (c => c.Componentordernumber == 119137 && c.Componentorderversion == 1);
c.Circuitordernumber = "11043913";
SubmitChanges();
Components.Where (c => c.Componentordernumber == 119137 && c.Componentorderversion == 1).Dump();
当我在LINQPad中运行它时,它在SubmitChange()时失败。有一个TargetInvocationException(在_InvokeMethodFast)。内在的例外是......
InvalidOperationException - The binary operator Equal is not defined for the types 'System.Int64' and 'System.Object'.
TargetSite: Expression.GetEqualityComparisonOperator (ExpressionType binaryType, String opName, Expression left, Expression right, Boolean liftToNull)
Stacke Trace:
at System.Linq.Expressions.Expression.GetEqualityComparisonOperator(ExpressionType binaryType, String opName, Expression left, Expression right, Boolean liftToNull)
at System.Linq.Expressions.Expression.Equal(Expression left, Expression right)
at IQToolkit.Data.EntityRef`1.QueryParent()
at IQToolkit.Data.EntityRef`1.get_Value()
答案 0 :(得分:3)
删除行时遇到了同样的问题。我通过将值为null的所有可空长字段设置为非空值(例如0L)来找到解决方案。
为了简化这一点,我写了一个简短的扩展方法PatchForDelete(见下文)并使用它:
var testUsers = Users.Where (a => a.login.StartsWith("test"));
testUsers.Dump();
foreach (var user in testUsers) {
MyExtensions.PatchForDelete(user);
AsdBenutzers.DeleteOnSubmit(user);
}
SubmitChanges();
此致 沃尔特
//
// Patch for Bug in IQ-Driver
//
// If each nullable long field which is null ist set to 0L
// DeleteOnSubmit() works!!
//
public static void PatchForDelete(object entity) {
var fields = entity.GetType().GetFields();
foreach (var field in fields) {
if (field.FieldType == typeof(long?)) {
var v = field.GetValue(entity);
if (v == null) {
field.SetValue(entity, 0L);
}
}
}
}
答案 1 :(得分:1)
我刚刚遇到了类似的错误。从所有我能够发现它看起来像IQ驱动程序中可以为空的外键的错误。
更多详情:http://forum.linqpad.net/discussion/225/nullable-foreign-key-bug-in-iq-driver
不幸的是,除了放弃linqPad解决方案之外,我不知道如何解决此错误。