2010-04-14 39 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模型中設置其默認值(如果使用的話)。

如果此列沒有保存,它將以默認值存儲,並且此錯誤不會再次發生。

相關問題