【问题标题】:How to Use a View Model with LINQ to Entities如何将视图模型与 LINQ to Entities 一起使用
【发布时间】:2014-11-21 17:59:54
【问题描述】:

我是 ASP.NET MVC 的新手,但我似乎无法理解有关视图模型的规则。我在这里展示的示例绝对类似于来自各种来源的其他示例,所以我完全糊涂了。

我在 VS 2013 MVC 5 上使用 Code First With Entity Framework 6,并创建了以下两个模型。

    public class Task
    {
        public int TaskId { get; set; }
        public int UserId { get; set; }
        public String Title { get; set; }
        public String Description { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }

        public virtual User User { get; set; }

    }



    public class User
    {
        public int UserId { get; set; }
        public String UserName { get; set; }
        public String Password { get; set; }
        public String FullName { get; set; }
        public String Email { get; set; }
        public String Status { get; set; }
        public String Role { get; set; }
        public virtual ICollection<Task> Tasks { get; set; }

    }

这是我的上下文。

public class FRESHContext : DbContext
    {


        public DbSet<User> Users { get; set; }
        public DbSet<Task> Tasks { get; set; }
        public DbSet<Artefact> Artefacts { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }

        public System.Data.Entity.DbSet<FRESH.ViewModel.ManageTasksViewModel> ManageTasksViewModels { get; set; }

    }

现在看到用户和任务之间存在一对多的关系,我想列出任务,显示分配给他们的用户(嗯,这“只是”一个学习示例),所以我认为这会受益于设计一个特殊的视图模型来强类型到视图页面并使用 LINQ to Entities 查询来派生模型以发送到视图页面。这是与强类型视图页面一起使用的视图模型。

  public class ManageTasksViewModel
    {

        public int TaskId { get; set; }
        public int UserId { get; set; }
        public String FullName { get; set; }
        public String Title { get; set; }
        public String Description { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }
    
    }

别担心,我已经正确地强输入了如下视图页面;

@model IEnumerable<FRESH.ViewModel.ManageTasksViewModel>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.UserId)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.FullName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>

etc etc .............(with brevity in mind lol.)

所以现在我创建了一个 LINQ to Entities 查询,我看了之后觉得这很合理,哦,我不知道一千个视频,哈哈。

 public class ManageTasksController : Controller
    {
        private FRESHContext db = new FRESHContext();

        // GET: ManageTasks
        public ActionResult Index()
        {
          
           var query = (from U in db.Users
                        join T in db.Tasks on U.UserId equals T.UserId
                        select new ManageTasksViewModel
                        {
                            TaskId = T.TaskId,
                            UserId = U.UserId,
                            FullName = U.FullName,
                            Title = T.Title,
                            Description = T.Title,
                            StartDate = T.StartDate,
                            EndDate = T.EndDate

                        }).Take(10).ToList();
            
            
            
            return View("Index",query);
        }

当然它建立了! yeehaar!,但是当代码到达 ActionResult Index() 时,我得到了这个异常。

An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code

Additional information: The entity or complex type 'FRESH.DAL.ManageTasksViewModel' cannot be constructed in a LINQ to Entities query.

那么我做错了什么,我还能用另一种方式做得更好吗,我没有研究过 LINQ to SQL,因为我认为这种方法肯定会奏效。任何帮助将非常感激。谢谢。

【问题讨论】:

  • 好的,从 Context 中删除了 ManageTasksViewModel,尽管它自己神奇地出现在那里,哈哈。仍然没有运气,有没有人知道链接到实体的初学者的好来源,我现在要下载'LINQ for Dummies',不是开玩笑!

标签: asp.net-mvc entity-framework view model linq-to-entities


【解决方案1】:

您的 dbcontext 中不应有视图模型。这只是一个视图模型,与您的实体完全不同。

public System.Data.Entity.DbSet<FRESH.ViewModel.ManageTasksViewModel> 
      ManageTasksViewModels { get; set; }

【讨论】:

  • 详细说明,Hash 是说要从你的 DbContext 中删除这一行。
【解决方案2】:

感谢所有在这方面花时间帮助我的人,基本上我再次阅读了 Contoso 大学教程并得到了答案,基本上它与我的第一次尝试非常相似,只是我在尝试。

选择新的 ManageTasksViewModel { . . . };

而我应该说的是;

选择新的 ManageTasksViewModel() { . . . }

公共类 ManageTasksController : 控制器 { 私有 FRESHContext db = new FRESHContext(); // GET: 管理任务 公共行动结果索引() { IQueryable 查询 = 来自 db.Tasks 中的任务 在 db.Users 中加入用户的 tasks.UserId 等于 users.UserId 选择新的 ManageTasksViewModel() { TaskId = 任务.TaskId, UserId = users.UserId, 全名 = users.FullName, 标题=任务。标题, 描述=任务。描述, 开始日期 = 任务.开始日期, EndDate = 任务.EndDate }; 返回视图(query.ToList()); }

无论如何希望这对某人有用。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多