C# 检索EF数据和集合的更好方法
因此,我有一个模型,其中包含一个包含项的模型列表,诸如此类:C# 检索EF数据和集合的更好方法,c#,entity-framework,linq-to-sql,C#,Entity Framework,Linq To Sql,因此,我有一个模型,其中包含一个包含项的模型列表,诸如此类: 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 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; }
}
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:无法将带[]的索引应用于“System.Collections.Generic.ICollection”类型的表达式
,我理解这是因为ICollection无法提供索引,然后我得到ObjectContext实例已被释放,不能再用于需要连接的操作。
用于我忘记检索的项目
所以我的问题是:是什么让这一切发生的?是否有一种方法可以一次检索所有数据,而不必单独获取所有特定项?更好的方法是什么?从上面的代码中,您想要实现什么 我正在努力追寻你的最终目标,但你是否会在这方面有所追求:
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()
}
public List GetAllInCart()
{
返回db.CART.Where(a=>a.CART\u IDE==CartIDE)
.包括(x=>x.Cart\u详细信息)
.包括(x=>x.Cart\u Detail.Pack)
.Include(x=>x.Cart\u Detail.Backstore\u库存)
托利斯先生()
}
我希望这有帮助:)这有帮助,而不是同时。问题在于,我想知道,因为我正在使用entity framework,所有这些都是为了检索连接到我的购物车详细信息的所有数据,并在数据库连接关闭后保留这些数据,而不必先单独获取每个数据。尝试在linq查询之前关闭延迟加载。例如db.Configuration.LazyLoadingEnabled=false;这将返回所有数据,并且您应该能够删除includes:)好的,我该怎么做?我已经关闭了延迟加载,但是现在通过外键连接的集合和项目不会加载。在上面的例子中,
BACKSTORE\u INVENTORY
将为空。实际上,我刚刚讨论了同一个问题,我稍微误解了延迟加载和急切加载的工作原理。没有解决确切问题的办法。您如何使用存储库?如果您实现了一个存储库,这意味着您只需要指定一次包含,然后重新使用该方法:)希望有帮助,如果您找到了合适的解决方案,请告诉我。谢谢