无法将null值分配给类型为System.Int64的成员,该成员是非可空值类型

时间:2010-04-14 11:34:54

标签: c# asp.net-mvc linq-to-sql

我在使用Linq to SQL的MVC2应用程序中遇到以下错误(我是两者都是新手)。我连接到一个实际的SQL服务器而不是奇怪的mdf:

System.InvalidOperationException The null value cannot be assigned to a member with type System.Int64 which is a non-nullable value type

我的SQL表有一个名为MessageID的列。它是BigInt类型,有一个主键,NOT NULL和一个IDENTITY 1 1,没有默认值

在我的dbml设计器中,它对此字段有以下声明:

[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_MessageId", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
public long MessageId
{
    get
    {
        return this._MessageId;
    }
    set
    {
        if ((this._MessageId != value))
        {
            this.OnMessageIdChanging(value);
            this.SendPropertyChanging();
            this._MessageId = value;
            this.SendPropertyChanged("MessageId");
            this.OnMessageIdChanged();
        }
    }
}

它一直告诉我无法分配null - 我没有通过null!它很长 - 它甚至不能为空!

我做了些蠢事吗?我无法在任何地方找到解决方案!

我通过将此属性的类型更改为Nullable<long>来完成此工作,但这肯定不对吗?

更新 我正在使用InsertOnSubmit。简化代码:

public ActionResult Create(Message message)
{
    if (ModelState.IsValid)
    {
       var db = new MessagingDataContext();
       db.Messages.InsertOnSubmit(message);
       db.SubmitChanges(); //line 93 (where it breaks)
    }
}

使用此问题顶部的错误中断SubmitChanges()。

UPDATE2: 堆栈跟踪:

   at Read_Object(ObjectMaterializer`1 )
   at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   at System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert(TrackedObject item)
   at System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject item)
   at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
   at Qanda.Controllers.MessagingController.Ask(Message message) in C:\Qanda\Qanda\Controllers\MessagingController.cs:line 93

UPDATE3: 没有人知道,我没有足够的影响力来提供赏金!我继续ASP.NET blog。请帮忙!

4 个答案:

答案 0 :(得分:6)

已经花了一段时间,但我发现这种情况正在发生,并认为我会分享。这是因为该表在插入时有一个触发器。我在这里更详细地写了optimistic concurrency exception with triggers。虽然这是实体框架,但我仍然确定它是引发我从一开始就感到沮丧的触发器

答案 1 :(得分:2)

您在Result类中定义的值类型需要设置为可为空。

在你的情况下使用int64?

检查设计器生成的designer.cs文件中的目标代码(如果您正在使用它)。

修改此代码并将其放在分部类中,以便设计人员不会过度编写代码。

答案 2 :(得分:0)

我遇到这个问题调用一个存储过程返回3个表的数据与左外连接问题是一个Bigint类型的列是空的所以我在过程中应用ISNULL(OID,0)来克服LINQ

答案 3 :(得分:0)

首先检查哪一列是异常原因,然后在表格或EF模型中设置其默认值(如果您正在使用它)。

如果您为此列保存任何内容,它将以默认值存储,并且此错误将永远不会再次发生。