【问题标题】:Set Linq To Sql Binary field to null将 Linq To Sql 二进制字段设置为 null
【发布时间】:2010-03-24 15:04:36
【问题描述】:

尝试将 Binary 字段设置为 null 会给我一个 ArgumentNull 异常。 我可以像这样new Binary(new byte[] {}); 将字段设置为空,但这不是空的,只是一个空列。有没有使用 LinqToSql 的解决方法?

【问题讨论】:

    标签: c# linq-to-sql varbinary


    【解决方案1】:

    你还有其他事情发生。我刚刚创建了一个带有 id(身份)、可为空的 varbinary(MAX)、不可为空的 varbinary(MAX)和时间戳的小样本表。使用以下代码可以正常工作,没有错误。

    using (var context = new TestDataContext())
    {
        var binarySample = new BinarySample
        {
            Image = null,
            NonNullImage = new Binary( new byte[0] ),
        };
        context.BinarySamples.InsertOnSubmit( binarySample );
        context.SubmitChanges();
    }
    

    此代码正确抛出(并捕获)SQLException,而不是 ArgumentNullException。

    try
    {
        using (var context = new TestDataContext())
        {
            var binarySample2 = new BinarySample
            {
                NonNullImage = null,
                Image = new Binary( new byte[0] )
            };
            context.BinarySamples.InsertOnSubmit( binarySample2 );
            context.SubmitChanges();
        }
    }
    catch (SqlException e)
    {
        Console.WriteLine( e.Message );
    }
    

    您是否可能有一个部分类实现,该实现具有用于抛出 ArgumentNullException 的属性的 SendPropertyChanging 处理程序?

    编辑:基于 OP 的评论。

    请注意,您不能将 byte[] 类型的变量直接分配给 Binary,因为这会调用 implicit conversion operation,并且隐式转换将引发 ArgumentNullException。您应该在尝试分配它之前检查该值是否为 null,如果 byte[] 变量为 null,则只需分配 null。对我来说,这似乎是一种奇怪的行为,我希望他们将来会改变它。 MSDN 文档指出未来版本可能会发生一些变化。

    【讨论】:

    • 我发表了我的评论作为答案以获得更好的代码格式,见下文
    【解决方案2】:

    您确定该字段在数据库中可以为空吗? linq 数据模型是否相应更新?如果使用基于属性的映射,[Column(...)] 属性中应该有一个CanBeNull=true 设置。

    【讨论】:

    • 好点,如果在将表添加到 Linq2SQL 设计器时未将其定义为可为空的列,则需要从设计器中删除表并“重新添加”它有更新的架构更改。
    【解决方案3】:

    @tvanfosson(发布为获得更好的代码格式的答案)

    是的,你是对的,发生了一些奇怪的事情,超出了我的 C# 知识范围。

    from.ImageThumbnail 是 byte[] to.ImageThumbnail 是二进制的

    使用 ?或者 ??运营商不会工作,如果我只使用 if else 它工作,很奇怪。我不明白为什么:-)

                if (from.ImageThumbnail != null) // works
                {
                    to.ImageThumbnail = from.ImageThumbnail;
                }
                else
                {
                    to.ImageThumbnail = null;
                }
    
                to.ImageThumbnail = from.ImageThumbnail != null ? from.ImageThumbnail : null; // fails
    
                to.ImageThumbnail = from.ImageThumbnail ?? null; // fails
    

    【讨论】:

    • 有一个从 byte[] 到 Binary (msdn.microsoft.com/en-us/library/…) 的隐式转换运算符来处理赋值。在参数为空的情况下,转换操作会引发异常。这实际上在操作员的文档中有所说明。坚持使用代码的第一个版本。
    • 仅供参考-您可能应该编辑您的问题并在此处添加此信息,而不是在单独的答案中。这将使您的问题对寻求解决同一问题的其他人更有用。
    【解决方案4】:

    您可以使用ExecuteQuery() 方法来传递您自己的SQL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2011-05-25
      相关资源
      最近更新 更多