我有一个数据库优先的应用程序,包含实体Promotion
和Product
,以及导航属性Promotion.Products
。促销中还有其他导航属性。我想在我的一个方法中忽略这些其他导航属性,并仅加载促销,每个促销都有一组产品(下面的代码是简化的)。
如果我使用延迟加载:
// Lazy Loading true by default
// ctx.ObjectContext.ContextOptions.LazyLoadingEnabled = false;
var data = from p in ctx.ObjectContext.Promotions select p;
data.First()。产品包含1个产品。
如果我使用预先加载:
ctx.ObjectContext.ContextOptions.LazyLoadingEnabled = false;
var data = from p in ctx.ObjectContext.Promotions.Include(p => p.Products)
select p;
data.First()。产品为空。
我已经成功地在其他地方使用了渴望加载。我不知道为什么它在这里不适合我。
我意识到我可以简单地使用linq连接来获得所需的结果,但这会使我的类复杂化并导致一些重复的代码。我也可以使用:
强制它ctx.ObjectContext.ContextOptions.LazyLoadingEnabled = false;
var data = from p in ctx.ObjectContext.Promotions
select new {
Promo = p,
Products = p.Products
};
在data.First().Promo.Products
或data.First().Products
中提供了1个项目,但我更愿意这样做#34;在书中#34;。
实体代码
public static Promotion CreatePromotion(global::System.Int32 id, ...)
{
Promotion promotion = new Promotion();
promotion.Id = id;
...
return promotion;
}
...
[XmlIgnoreAttribute()]
[SoapIgnoreAttribute()]
[DataMemberAttribute()]
[EdmRelationshipNavigationPropertyAttribute("MyDataModel", "PromotionsProducts", "Product")]
public EntityCollection<Product> Products
{
get
{
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection<Product>("MyDataModel.PromotionsProducts", "Product");
}
set
{
if ((value != null))
{
((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection<Product>("MyDataModel.PromotionsProducts", "Product", value);
}
}
}