首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载上下文跟踪的实体的未映射字段的EF6最佳实践

加载上下文跟踪的实体的未映射字段的EF6最佳实践
EN

Stack Overflow用户
提问于 2017-11-17 11:21:08
回答 1查看 315关注 0票数 2

考虑到博客数据模型:

代码语言:javascript
复制
Blog:
int Id
ICollection<Post> Posts

Post:
int Id
int BlogId
DateTime Date

然后加载博客的最新发布日期(LatestPostDate),并绑定到UI,同时由上下文跟踪它们。

有一些解决方案,例如使用DTO,但是结果实体不被上下文跟踪。此外,我还可以将LatestPostDate设置为NotMapped,定义表值函数,并在DbSet上应用SqlQuery。虽然,NotMapped字段不是以这种方式加载的。

什么是最佳做法?

我尽量不将列添加到表中,也避免在加载后计算值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-17 15:55:58

最佳实践是处理ViewModel中的显示问题。

但是,由于您不想将实体映射到另一个类,我们首先来看看[NotMapped]变量,使用LINQ来计算最新的post日期,而不是普通的SQL。

代码语言:javascript
复制
using System.Linq;

public class Blog {
    public int Id { get; set; }
    public virtual ICollection<Post> Posts { get; set; }

    [NotMapped]
    public DateTime? LatestPostDate {
        get {
            return Posts.OrderBy(p => p.Date).LastOrDefault()?.Date;
        }
    }
}

这样,只有在访问属性LatestPostDate (可能在UI呈现期间)时才计算值。您可以通过急装 ( Posts )减少DB访问的次数,尽管这将增加您正在使用的数据集的大小。

代码语言:javascript
复制
var blogs = _dbContext.Blogs.Include(b => b.Posts).ToArray();

但是,如果使用ViewModel,则可以一次填充LatestPostDate

代码语言:javascript
复制
public class BlogViewModel {
    public int Id { get; set; }
    public DateTime? LatestPostDate { get; set; }
}

var viewModels = _dbContext.Blogs.Select(b => new BlogViewModel {
    Id = b.Id,
    LatestPostDate = b.Posts.OrderBy(p => p.Date).LastOrDefault()?.Date;
}).ToArray();

考虑到上下文没有跟踪ViewModel :在编辑usecase中,再次使用ViewModel提供的Id加载实体,并映射更新的属性。这使您完全控制应该可编辑的属性。作为一种奖励,ViewModel是进行输入验证、格式化等的好地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47349505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档