无法使用LINQPad 4更新行

时间:2013-03-18 15:39:26

标签: c# linq oracle linq-to-sql linqpad

我可以使用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()

2 个答案:

答案 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解决方案之外,我不知道如何解决此错误。