Tho*_*ian 5 c# linq-to-entities entity-framework entity-framework-core
众所周知,EF-Core 中不存在延迟加载。所以这意味着我不得不事后才进行查询。所以既然要思考,那我不妨尝试一下好好做。
我有一个相当标准的更新查询,但我想,嘿,我并不总是需要包含HeaderImage和PromoImageFK 对象。应该有办法实现这一点。但我无法找到一种方法来稍后执行包含。事实上,我想也许在我真正对这个对象进行工作之前就包括在内。这样我也许能够自动化一些渴望。
ArticleContent ac = _ctx.ArticleContents
.Include(a=> a.Metadata)
.Include(a=> a.HeaderImage)
.Include(a=> a.PromoImage)
.Single(a => a.Id == model.BaseID);
ac.Title = model.Title;
ac.Ingress = model.Ingress;
ac.Body = model.Body;
ac.Footer = model.Footer;
if (model.HeaderImage != null)
{
ac.HeaderImage.FileURL = await StoreImage(model.HeaderImage, $"Header_{model.Title.Replace(" ", "_")}_{rand.Next()}");
}
if (model.PromoImage != null)
{
ac.PromoImage.FileURL = await StoreImage(model.PromoImage, $"Promo_{model.Title.Replace(" ", "_")}_{rand.Next()}");
}
ac.Metadata.EditedById = uId;
ac.Metadata.LastChangedTimestamp = DateTime.Now;
await _ctx.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)
额外的
需要明确的是,这是EF7 (Core),我在找到一个允许我按需添加包含内容的解决方案之后,希望在初始之后_ctx.ArticleContents.Include(a=> a.Metadata).Single(a => a.Id == model.BaseID).
我将创建一个方法来获取数据,该方法将属性包含为表达式:
static ArticleContent GetArticleContent(int ID,
params Expression<Func<ArticleContent, object>>[] includes)
{
using(var ctx = new MyContext())
{
var acQuery = _ctx.ArticleContents.Include(a=> a.Metadata);
foreach(var include in includes)
acQuery = acQuery.Include(include);
return acQuery.Single(a => a.Id == model.BaseID);
}
}
Run Code Online (Sandbox Code Playgroud)
然后在main方法中:
var ac = GetArticleContent(3, a => a.HeaderImage, a => a.PromoImage);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3300 次 |
| 最近记录: |