[英]LINQ InsertOnSubmit: NullReferenceException
我有這個代碼:
using DC = MV6DataContext;
using MV6; // Business Logic Layer
// ...
public DC.MV6DataContext dc = new DC.MV6DataContext(ConnectionString);
IP ip = new IP(Request.UserHostAddress);
dc.IPs.InsertOnSubmit(ip);
dc.SubmitChanges();
// in Business Logic layer:
public class IP : DC.IP {
public IP(string address) { ... }
}
在嘗試InsertOnSubmit(ip)時,我得到一個NullReferenceException(對象引用未設置為對象的實例)。 dc不為空; ip和ip的所有屬性都不為null; 雖然有些是空的。
VS2008不會讓我進入InsertOnSubmit,因此在評估時我無法知道具體為null。 是什么賦予了?
注意:我已經檢查過,並且由FK關系創建的所有Linq.EntitySets都存在且非空。
實際上最好添加對構造函數的調用,該構造函數也調用泛型構造函數,例如:
public IP(string address) : this() {
...
}
得到它了。
我沒有創建一個繼承自DataContext類的類,而是使用業務邏輯層中的部分類擴展DC類本身。 從那里我可以添加我想要的任何構造函數和方法。
在這種情況下,有必要從現有(自動生成)構造函數中復制代碼:
public IP(string address) {
Address = address;
Domain = "";
Notes = "";
FirstAccess = DateTime.Now;
LastAccess = DateTime.Now;
this._Sessions = new EntitySet<Session>(new Action<Session>(this.attach_Sessions), new Action<Session>(this.detach_Sessions));
OnCreated(); }
不確定那個OnCreated處理程序中有什么,但它似乎正在做我之前的工作。 工作正常:)
由於默認構造函數已初始化base(),this._Sessions並運行OnCreated方法,因此您需要在擴展構造函數中執行以下操作:
public IP(string address) : this()
{
Address = address;
Domain = "";
Notes = "";
FirstAccess = DateTime.Now;
LastAccess = DateTime.Now;
}
這是設計器生成的DataContext還是您自己手工構建的DataContext。 我懷疑在您嘗試InsertOnSubmit()
時可能無法實例化IP表。 我無法看到設計器生成的DataContext會如何發生這種情況,但我已經知道忘記在我自己的代碼中不時初始化我的集合。
我的情況與提問者略有不同,但出於同樣的原因也出現了同樣的錯誤。 我在我的數據庫實體的分部類中編寫了新的構造函數,然后嘗試在InsertOnSubmit
調用中使用結果對象。
這些答案都沒有直接幫助我,但我能夠在閱讀完所有內容后弄清楚他們得到了什么。
實體的自動生成的無參數構造函數執行InsertOnSubmit
需要發生的事情,所以如果你重載構造函數 - 比如我 - 或者從類繼承 - 比如提問者 - 你需要調用base來自新構造函數的構造函數,如下所示:
public partial class Entity {
public Entity( Type parameter ) : this() {
// do things with the parameter
}
}
要么
public class SubEntity: Entity {
public SubEntity( Type parameter ) : base() {
// do things with the parameter
}
}
您可以嘗試查看正在發生的事情,將要做什么更改,如果您在SubmitChanges之前放置一個斷點,並快速觀察dc.GetChangeSet() 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.