2014-01-25 35 views
0

所以我有一个包含其中包含项目,等等机型列表,这样的模式:一种更好的方式来检索EF数据和集合

public partial class CART 
{ 

    public CART() 
    { 
     //this.CART_DETAIL = new HashSet<CART_DETAIL>(); 
     this.CART_DETAIL = new List<CART_DETAIL>(); 
    } 

    public int CART_IDE { get; set; } 
    public int CART_COUNT { get; set; } 
    public string SHOPPING_CART_IDE { get; set; } 

    public virtual IList<CART_DETAIL> CART_DETAIL { get; set; } 

} 

public partial class CART_DETAIL 
{ 
    public int CART_DETAIL_IDE { get; set; } 
    public int CART_IDE { get; set; } 
    public int CART_DETAIL_COUNT { get; set; } 
    public Nullable<int> PACK_IDE { get; set; } 
    public Nullable<int> BACKSTORE_INVENTORY_IDE { get; set; } 

    public virtual CART CART { get; set; } 
    public virtual PACK PACK { get; set; } 
    public virtual BACKSTORE_INVENTORY BACKSTORE_INVENTORY { get; set; } 
} 

public partial class BACKSTORE_INVENTORY 
{ 
    public BACKSTORE_INVENTORY() 
    { 
     this.CART_DETAIL = new HashSet<CART_DETAIL>(); 
     this.ORDER_DETAIL = new HashSet<ORDER_DETAIL>(); 
    } 

    public int BACKSTORE_INVENTORY_IDE { get; set; } 
    public int INVENT_IDE { get; set; } 
    public int STORE_IDE { get; set; } 
    public decimal BACKSTORE_INVENTORY_PRICE { get; set; } 
    public int BACKSTORE_STOCK_QTY { get; set; } 
    public decimal BACKSTORE_DISCOUNT { get; set; } 
    public decimal BACKSTORE_SELLING_PRICE { get; set; } 

    public virtual INVENTORY INVENTORY { get; set; } 
    public virtual STORE STORE { get; set; } 
    public virtual ICollection<CART_DETAIL> CART_DETAIL { get; set; } 
    public virtual ICollection<ORDER_DETAIL> ORDER_DETAIL { get; set; } 
} 

当我打开一个连接,并咨询数据,一切都很好,但如果我retrive在一个视图中的整个数据,例如,除非我修改​​到List,然后进行这样的:

CART cart = 
        db.CART.FirstOrDefault(_item => _item.SHOPPING_CART_IDE == mShoppingCartID && _item.CART_ACTIVE_INDICATOR); 

if (cart != null) 
{ 
    cart.CART_EXP_TIME = DateTime.Now.AddMinutes(90); 

    cart.USER_SESSION_IDE = UserSessionManager.GetUserSession().mUserSessionID; 

    cart.CART_DETAIL = cart.CART_DETAIL.ToList(); 

    foreach (var cartDetail in cart.CART_DETAIL) 
    { 
     if(cartDetail.BACKSTORE_INVENTORY_IDE != null) 
     { 
      cartDetail.BACKSTORE_INVENTORY = 
       db.BACKSTORE_INVENTORY.First(_item => _item.BACKSTORE_INVENTORY_IDE == cartDetail.BACKSTORE_INVENTORY_IDE); 

      cartDetail.BACKSTORE_INVENTORY.INVENTORY = 
       db.INVENTORY.Find(cartDetail.BACKSTORE_INVENTORY.INVENT_IDE); 

      cartDetail.BACKSTORE_INVENTORY.INVENTORY.CARD = 
       db.CARD.Find(cartDetail.BACKSTORE_INVENTORY.INVENTORY.CARD_IDE); 
     } 
     else 
     { 
      cartDetail.PACK = db.PACK.First(_item => _item.PACK_IDE == cartDetail.PACK_IDE); 
     } 
    } 

    db.SaveChanges(); 
} 

我收到以下错误:CS0021: Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.ICollection<MyApp.Models.DAL.Entities.CART_DETAIL>'我的理解是因为ICollection可以没有能力索引,然后我得到The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.我忘了回顾的项目。

所以我的问题:是什么让这发生?是否有办法一次检索所有数据,而不必分别获取所有特定项目?做更好的事情吗?

回答

1

你想通过上面的代码实现什么?

我奋力追随你的最终目标是什么,但会沿着这些路线的东西是你在找什么:

public List<Cart> GetAllInCart() 
    { 
    return db.CART.Where(a => a.Cart_IDE == CartIDE) 
        .Include(x => x.Cart_Detail) 
        .Include(x => x.Cart_Detail.Pack) 
        .Include(x => x.Cart_Detail.Backstore_Inventory) 
        .ToList() 
    } 

我希望这有助于:)

+0

这有助于,而不是在同时。问题是,我想知道,因为我正在使用实体框架,所有检索连接到我的购物车详细信息的所有数据,并在我的数据库连接关闭后保留它,而不是首先单独获取它们中的每一个。 – hsim

+0

尝试在linq查询之前关闭延迟加载。 E.g db.Configuration.LazyLoadingEnabled = false;这应该返回所有数据,你应该能够删除包括:) – Heberda

+0

好吧,我该怎么做? – hsim

相关问题