簡體   English   中英

LINQ InsertOnSubmit:NullReferenceException

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM