2012-08-12 75 views
2

我使用EF4.x,Code First和Castle Windsor的DI。我的問題:某些虛擬屬性在檢索新插入的實體時會返回null。我對此很陌生,所以請原諒我對一切工作的無知。一個很簡單的例子是這樣的:虛擬屬性null當檢索一個新插入的項目

public class Address 
{ 
    public int AddressID { get; set; } 
    public string Street { get; set; } 
    public int ProvinceID { get; set; } 
    public virtual Province { get; set; } 
    etc.... 
} 

public class Province 
{ 
    public int ProvinceID { get; set; } 
    public string Name { get; set; } 
    public string Abbreviation { get; set; } 
    public int DisplayOrder { get; set; } 
    etc... 
} 
的SaveChanges(),我可以看到在數據庫中創建正確的記錄,但在加載地址實體隨後的頁面請求,ProvinceID設置正確後

所以,但虛擬省份爲空。重建後,沒有問題。我究竟做錯了什麼? TIA

更多信息:

我在工作模式庫和單位使用的DbContext。我有一個包含所有常見CRUD方法的抽象EF RepositoryBase類。下面是例子的共同GET方法:

public T Get(params object[] keyValues) 
    { 
    return _dbSet.Find(keyValues); 
    } 

    public IQueryable<T> Get(Func<T, bool> filter) 
    { 
    return _dbSet.Where(filter).AsQueryable(); 
    } 

    public IQueryable<T> GetAll() 
    { 
    return _dbSet.AsQueryable(); 
    } 

_dbSet設置是這樣的:

_dbSet = ((DbContext)_context).Set<T>(); // _context is of IDbContext 

也許這裏的東西導致了奇怪的問題?

+0

是否啓用延遲加載? – 2012-08-13 04:22:16

+0

是否默認啓用延遲加載?另外,其他導航屬性也可以正常工作,即使這個導航屬性只在檢索新插入的記錄時失敗。在下一次重建時,這也開始工作。 – 2012-08-13 05:19:02

+0

而你需要啓用代理創建。 – 2012-08-13 05:20:13

回答

2

所以你實際上有2個選項與EF導航屬性加載,延遲加載和顯式加載。根據我的經驗,顯式加載要好得多,因爲這會導致很大的性能問題。

我寫了一篇關於導航屬性的文章,您可以閱讀here

要使用顯式導航屬性加載,請使用.Include語句指定要在每個查詢中加載哪些屬性。

當你使用lazyloading時,我相信你需要虛擬裝飾全部 nav屬性在你的上下文中,當你調用get屬性時,數據庫會被查詢。

+0

謝謝盧克。這是一篇很棒的文章,我會考慮你的加載意見。但我首先想弄清楚爲什麼我會遇到這個問題。 – 2012-08-14 05:28:33

0

我用下一個解決方法:分離實體和加載再次

public T Reload<T>(T entity) where T : class, IEntityId 
{ 
    ((IObjectContextAdapter)_dbContext).ObjectContext.Detach(entity); 
    return _dbContext.Set<T>().FirstOrDefault(x => x.Id == entity.Id); 
}