2015-09-23 46 views
0

我有在另外的工作程序2個新的實體,我已經修剪無關性(一切都被標記爲虛擬):EF6延遲加載不工作的導航屬性

QuoteOverrideRequest

public virtual int RequestedById { get; set; } 
public virtual int QuoteId { get; set; } 
public virtual int StatusId { get; set; } 

//nav properties 
public virtual Customer RequestedBy { get; set; } 
public virtual Quote Quote { get; set; } 
public virtual QuoteOverrideRequestStatus Status { get; set; } 

所有3個導航屬性都以相同的方式映射。當我創建一個新的QuoteOverrideRequest並插入它時,RequestedBy和Quote會自動填充其實體。狀態不是。

QuoteOverrideRequest request = new QuoteOverrideRequest(); 
request.QuoteId = quoteId; 
request.RequestedById = _workContext.CurrentCustomer.Id; 
request.StatusId = 1; 

_quoteService.InsertOverrideRequest(request); 

的插入功能被調用的存儲庫將對象添加到一個DbSet並調用DbContext.SaveChanges()

我假定問題是與QuoteOverrideRequestStatus因爲其他2班延遲加載正確。如果我在函數中早些時候獲得了該狀態的一個實例,它將在插入後顯示在狀態屬性中。

QuoteOverrideRequestStatus類有一個公共無參數構造函數,它的所有屬性都是虛擬的。

public partial class QuoteOverrideRequestStatus : BaseEntity 
{ 
    public QuoteOverrideRequestStatus() { } 

    public virtual string Name { get; set; } 
    public virtual int DisplayOrder { get; set; } 
} 

BaseEntity具有Id屬性。我已經證實,當所有這些都運行時,延遲加載和代理生成在DbContext上都是真實的。

回答

0

new QuoteOverrideRequest()

這是不正確的。對於使用關鍵字new實例化的模型的屬性,延遲加載不起作用。

您應該使用db.Set<T>().Create()其中db是您的實例DbContextT是您的模型。

這將實例化您的模型的正確代理對象,該對象將啓用延遲加載導航屬性。

+0

完美的工作。因爲其中兩個屬性會正確加載,但我剛剛意識到這是因爲他們已經在其他原因的環境中。一旦我將RequestedById切換到其他人,它將不會加載。現在我以這種方式實例化實體,它都可以工作。謝謝。 – AndyMcKenna