Asp.net mvc 在接下来的5分钟内,你不必一次又一次地点击db

Asp.net mvc 在接下来的5分钟内,你不必一次又一次地点击db,asp.net-mvc,entity-framework,dto,asp.net-mvc-viewmodel,Asp.net Mvc,Entity Framework,Dto,Asp.net Mvc Viewmodel,您无法在ASP.NET中缓存EF模型,否则最终将遇到系统中随机出现的难以追踪的严重问题 您可以将EF对象粘贴到缓存中,甚至可以从缓存中检索它们。但是,EF实体附加到数据库上下文对象,该上下文最终超出范围并被.NET垃圾收集。如果发生这种情况后,您的学生对象仍在缓存中,您检索它并尝试使用它(再次使用您自己的示例)获取教师子类“Student.Teacher” 如果Teacher对象不是由EF加载的,而是由EF加载的,那么您将得到死亡的黄色屏幕。Ef将尝试使用上下文去接那个老师,但没有,它会爆炸 为

您无法在ASP.NET中缓存EF模型,否则最终将遇到系统中随机出现的难以追踪的严重问题

您可以将EF对象粘贴到缓存中,甚至可以从缓存中检索它们。但是,EF实体附加到数据库上下文对象,该上下文最终超出范围并被.NET垃圾收集。如果发生这种情况后,您的学生对象仍在缓存中,您检索它并尝试使用它(再次使用您自己的示例)获取教师子类“Student.Teacher”

如果Teacher对象不是由EF加载的,而是由EF加载的,那么您将得到死亡的黄色屏幕。Ef将尝试使用上下文去接那个老师,但没有,它会爆炸

为了防止所有这些,最好将EF对象移动到DTO中,然后您就可以安全地传输数据、缓存数据等,而无需担心


这种体系结构中唯一的痛苦在于将DTO转换为viewmodels和EF模型,正如您所说的那样。但正如我前面提到的,使用适当的基类来共享字段,并使用AutoMapper或其他映射引擎将帮助您快速地从DTO映射到ViewModels和EF对象

为什么使用空字段的DTO方法不正确?使用DTO,我将不会有空字段。如果我返回数据库实体,我将得到空字段。看到基类了吗?我不需要国家和其他东西在我的客户端。问题是每当我需要以不同的方式返回数据时,我发现创建新类(DTO或ViewModel)的效率非常低。这是有道理的,但并不能完全回答我的问题。真正的问题是,我创建了很多视图模型,但发现这非常低效。按照目前的方式,我将在不到几个月的时间内拥有100个文件。不是很优雅。你提到你制作了很多小的视图模型,比如Id,一些值。在这些情况下,如何返回IDictionary作为模型,而不是为每个场景定义具体的模型。这将消除您正在创建的所有关键值类。这只是一个示例。正如我所说,我的真实项目在大多数情况下都有复杂的查询和结果。我没有少于5个字段的视图模型。视图模型与视图的比例应为1:1。如果你有太多的东西,想办法重构你的视图和动作。请参阅此链接的底部,该链接对复制进行了总结。是的,我明白了。问题是,我的大多数观点都是几个实体的“组合”。很难创建一个“全面”的视图模型。此外,还有几种方法可用于不同的事情,例如加载选择框。无论哪种方式,我都会检查链接,谢谢!我现在基本上就是这么做的。。但我从EF搬到了MongoDb。回答得好。
public class Student : BaseEntity
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public DateTime DateOfBirth { get; set; }
  public Teacher Tutor { get; set; }
}

public class Teacher : BaseEntity
{
  public int Id { get; set; }
  public string Name { get; set; }
  public ICollection<Student> Students { get; set; }
}

public class BaseEntity
{
  public byte State { get; set; }
  public Datetime CreateDate { get; set; }
  public Datetime UpdateDate { get; set; }
}
var students = context.Students.Include(x => x.Teacher).ToList();
var students = context.Students.Include(x => x.Teacher)
                               .Select(x => new 
                               {
                                   Name = x.Name,
                                   TeacherName = x.Teacher.Name
                               }).ToList();
var students = context.Students.Include(x => x.Teacher).ToList();
var students = context.Students.Include(x => x.Teacher)
                               .Select(x => new 
                               {
                                   Name = x.Name,
                                   TeacherName = x.Teacher.Name
                               }).ToList();