2010-04-14 47 views
5

我在我的MVC2应用程序中使用Linq to SQL(我对这两个都是新手)收到以下错误。我连接到一个实际的SQL服务器不奇怪MDF:空值不能分配给类型System.Int64这是一个非空值类型的成员

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

我的SQL表有一个称为邮件ID列。这是BigInt有型,有一个主键,NOT NULL和身份11,没有默认

在我的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!这很长 - 它甚至不可能是空的!

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

我做了这个工作,通过改变这个属性的类型为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) 
    } 
} 

Breaking on SubmitChanges()with this error at the top of this question。

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

您是否尝试使用InsertOnSubmit方法并导致此异常? – Raja 2010-04-14 11:39:47

+0

你能显示导致错误的代码吗? – Geoff 2010-04-14 11:43:24

+0

谢谢。我已经更新了我的问题 – BritishDeveloper 2010-04-14 11:53:20

回答

6

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

+1

+1感谢您的博客。这是浪费了两个小时毫无意义的调试之后我能找到的唯一参考资料。我回到了ADO.Net。 – Laramie 2010-11-10 21:31:54

+1

对我来说也是+1,除了我的是System.Int32(标识列数据类型是INT);还有一个'INSTEAD OF INSERT'触发器。潜在的问题是,当触发器处于活动状态时,SCOPE_IDENTITY()返回NULL(对我来说,这似乎是一个错误);不过旧的不推荐的@@ IDENTITY值是正确的。 – devstuff 2011-02-15 20:41:31

+0

顺便说一句,这是一个已知问题:http://connect.microsoft.com/SQLServer/feedback/details/427640/instead-trigger-break-the-scope-identity-scope – devstuff 2011-02-15 21:57:34

2

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

在你的情况使用int64?

如果您正在使用它,请查看设计器生成的designer.cs文件中的对象代码。

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

+0

或只是在dbml属性中设置它:nullable = false。好吧,这有效,但为什么它应该是空的?我注意到这个问题解决了它,但想确保这是正确的。不只是一个破解 – BritishDeveloper 2010-04-17 06:45:19

+0

值类型不能为空,数据库字段返回空值,当它们传递时,它们将引发异常。通过将值类型变量设置为可空,值类型可以接受空值。 – 2010-04-21 21:53:40

0

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

0

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

如果此列没有保存,它将以默认值存储,并且此错误不会再次发生。

相关问题