我在使用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。请帮忙!
答案 0 :(得分:6)
已经花了一段时间,但我发现这种情况正在发生,并认为我会分享。这是因为该表在插入时有一个触发器。我在这里更详细地写了optimistic concurrency exception with triggers。虽然这是实体框架,但我仍然确定它是引发我从一开始就感到沮丧的触发器
答案 1 :(得分:2)
您在Result类中定义的值类型需要设置为可为空。
在你的情况下使用int64?
检查设计器生成的designer.cs文件中的目标代码(如果您正在使用它)。
修改此代码并将其放在分部类中,以便设计人员不会过度编写代码。
答案 2 :(得分:0)
我遇到这个问题调用一个存储过程返回3个表的数据与左外连接问题是一个Bigint类型的列是空的所以我在过程中应用ISNULL(OID,0)来克服LINQ
答案 3 :(得分:0)
首先检查哪一列是异常原因,然后在表格或EF模型中设置其默认值(如果您正在使用它)。
如果您为此列保存任何内容,它将以默认值存储,并且此错误将永远不会再次发生。