【问题标题】:Accessing data in a ViewModel访问 ViewModel 中的数据
【发布时间】:2013-02-13 23:10:33
【问题描述】:

我有以下实体框架代码 sn-p,它有一个“Groups”表和一个包含我需要的 ApplicationID 字段的子“ApplicationsGroupsLK”表。

IEnumerable<Groups> Groups = DbContext.Groups.Include("ApplicationsGroupsLK").Where(p => p.GroupNumber > 0);

子数据显然在集合中返回。

我基本上需要显示父数据以及子 ApplicationID 字段(许多应用程序到 1 个组)。

在我的 MVC 视图中,我的 ViewModel 应该是什么样子,它将包含我需要的返回的父子数据,以便我可以正确地将其绑定到网格?

第二次发帖:

此外,以下模型是从实体框架生成的:

public partial class Project
    {
        public Project()
        {
            this.TimeTrackings = new HashSet<TimeTracking>();
        }

     [DataMember]
        public short ProjectID { get; set; }
     [DataMember]
        public short CustomerID { get; set; }
     [DataMember]
        public string Name { get; set; }
     [DataMember]
        public string Description { get; set; }
     [DataMember]
        public short CategoryID { get; set; }
     [DataMember]
        public short PriorityID { get; set; }
     [DataMember]
        public short StatusID { get; set; }
     [DataMember]
        public Nullable<decimal> Quote { get; set; }
     [DataMember]
        public string Notes { get; set; }
     [DataMember]
        public System.DateTime CreatedDate { get; set; }
     [DataMember]
        public Nullable<System.DateTime> UpdatedDate { get; set; }

     [DataMember]
        public virtual Category Category { get; set; }
     [DataMember]
        public virtual Customer Customer { get; set; }
     [DataMember]
        public virtual Priority Priority { get; set; }
     [DataMember]
        public virtual Status Status { get; set; }
     [DataMember]
        public virtual ICollection<TimeTracking> TimeTrackings { get; set; }
    }

可以看到 TimeTrackings 是 Project 的子表。您还可以看到 CategoryID、CustomerID、PriorityID 和 StatusID 是父表具有的外键。在这种情况下,我只对 CategoryID FK 感兴趣。

我还没有这样做(不是在我家里的机器上),但是当我将数据输入这个模型时,公共虚拟类别类别字段中实际包含什么?由于不是集合,查询执行后该字段返回什么数据。

第三篇文章: Telerik asp.net 用于 DB 调用的 mvc 语法:

IEnumerable<Groups> GroupList = db.GetGroups();

            return View(new GridModel<Groups>
            {
                Data = GroupList
            });

第四篇文章: Trey,下面是我为我的目的修改的代码,希望你能在我实现它之前检查它。我想我理解它并且看起来很棒......

public partial class Project
    {
        public Project()
        {
            this.TimeTrackings = new HashSet<TimeTracking>();
        }

     [DataMember]
        public short ProjectID { get; set; }
     [DataMember]
        public short CustomerID { get; set; }
     [DataMember]
        public string Name { get; set; }
     [DataMember]
        public string Description { get; set; }
     [DataMember]
        public short CategoryID { get; set; }
     [DataMember]
        public short PriorityID { get; set; }
     [DataMember]
        public short StatusID { get; set; }
     [DataMember]
        public Nullable<decimal> Quote { get; set; }
     [DataMember]
        public string Notes { get; set; }
     [DataMember]
        public System.DateTime CreatedDate { get; set; }
     [DataMember]
        public Nullable<System.DateTime> UpdatedDate { get; set; }
     [DataMember]
        public short ApplicationID { get; set; }
     [DataMember]
        public string ApplicationName { get; set; }
     [DataMember]
        public virtual Category Category { get; set; }
     [DataMember]
        public virtual Customer Customer { get; set; }
     [DataMember]
        public virtual Priority Priority { get; set; }
     [DataMember]
        public virtual Status Status { get; set; }
     [DataMember]
        public virtual ICollection<TimeTracking> TimeTrackings { get; set; }


     public ProjectModel(Project project)
     {
        ProjectID = project.ProjectID;
        CustomerID = project.CustomerID;
        Name = project.Name;
        Description = project.Description;
    CategoryID = project.CategoryID;
        PriorityID = project.PriorityID;
        StatusID = project.StatusID;
        Quote = project.Quote;
        Notes = project.Notes;
        CreatedDate = project.CreatedDate;
        UpdatedDate = project.UpdatedDate;
        ApplicationID = project.ApplicationsGroupsLK.ApplicationID;
        ApplicationName = project.ApplicationsGroupsLK.ApplicationName;
     }


     // Neat Linq trick to convert database query results directly to Model
     public static IList<ProjectModel> FlattenToThis(IList<Project> projects)
     {
        return projects.Select(project => new ProjectModel(project)).ToList();
     }

    }

第五帖:

using (wmswebEntities DbContext = new wmswebEntities())
                {
                    DbContext.Configuration.ProxyCreationEnabled = false;
                    DbContext.Database.Connection.Open();

                    IEnumerable<Projects> projects = DbContext.Projects.Where(p => p.GroupNumber > 0);

                    IList<ProjectModel> results = Project.FlattenToThis(projects);

                    return results

}

第六篇 命名空间 CMSEFModel { 使用系统; 使用 System.Collections.Generic;

public partial class GroupModel
{
    public GroupModel()
    {
        this.ApplicationsGroupsLKs = new HashSet<ApplicationsGroupsLK>();
        this.GroupApplicationConfigurationsLKs = new HashSet<GroupApplicationConfigurationsLK>();
        this.UsersGroupsLKs = new HashSet<UsersGroupsLK>();
    }

    public int GroupNumber { get; set; }
    public string GroupName { get; set; }
    public int GroupRank { get; set; }
    public bool ActiveFlag { get; set; }
    public System.DateTime DateAdded { get; set; }
    public string AddedBy { get; set; }
    public System.DateTime LastUpdated { get; set; }
    public string LastUpdatedBy { get; set; }
    // Application - Lazy Loading population
    public int ApplicationID { get; set; }
    // UsersGroupsLK - Lazy Loading population
    public int UserNumber { get; set; }
    public string UserID { get; set; }

    public virtual ICollection<ApplicationsGroupsLK> ApplicationsGroupsLKs { get; set; }
    public virtual ICollection<GroupApplicationConfigurationsLK> GroupApplicationConfigurationsLKs { get; set; }
    public virtual ICollection<UsersGroupsLK> UsersGroupsLKs { get; set; }

    public GroupModel()
    {}
    public GroupModel(GroupModel group)
     {
        GroupNumber = group.GroupNumber;
        GroupName = group.GroupName;
        ActiveFlag = group.ActiveFlag;
        DateAdded = group.DateAdded;
        AddedBy = group.AddedBy;
        LastUpdated = group.LastUpdated;
        LastUpdatedBy = group.LastUpdatedBy;
        UserNumber = group.UsersGroupsLKs.
     }


 // Neat Linq trick to convert database query results directly to Model
 public static IList<GroupModel> FlattenToThis(IList<GroupModel> groups)
 {
    return groups.Select(group => new GroupModel(group)).ToList();
 }
}

}

Seventh Post - 这是我之前发布的错误遇到问题的模型。 Trey,如果你能帮忙的话,我真的很感激……除非我能让这部分工作,否则我会“死在水里”。

namespace CMSEFModel
{
    using System;
    using System.Collections.Generic;

    public partial class Group
    {
        public Group()
        {
            this.ApplicationsGroupsLKs = new HashSet<ApplicationsGroupsLK>();
            this.GroupApplicationConfigurationsLKs = new HashSet<GroupApplicationConfigurationsLK>();
            this.UsersGroupsLKs = new HashSet<UsersGroupsLK>();
        }

        public int GroupNumber { get; set; }
        public string GroupName { get; set; }
        public int GroupRank { get; set; }
        public bool ActiveFlag { get; set; }
        public System.DateTime DateAdded { get; set; }
        public string AddedBy { get; set; }
        public System.DateTime LastUpdated { get; set; }
        public string LastUpdatedBy { get; set; }
        // Application - Lazy Loading population
        public int ApplicationID { get; set; }
        // UsersGroupsLK - Lazy Loading population
        public int UserNumber { get; set; }
        public string UserID { get; set; }

        public virtual ICollection<ApplicationsGroupsLK> ApplicationsGroupsLKs { get; set; }
        public virtual ICollection<GroupApplicationConfigurationsLK> GroupApplicationConfigurationsLKs { get; set; }
        public virtual ICollection<UsersGroupsLK> UsersGroupsLKs { get; set; }

        public GroupModel(Group group)
         {
            GroupNumber = group.GroupNumber;
            GroupName = group.GroupName;
            ActiveFlag = group.ActiveFlag;
            DateAdded = group.DateAdded;
            AddedBy = group.AddedBy;
            LastUpdated = group.LastUpdated;
            LastUpdatedBy = group.LastUpdatedBy;
            UserNumber = group.UsersGroupsLKs.
         }

     // Neat Linq trick to convert database query results directly to Model
     public static IList<GroupModel> FlattenToThis(IList<Group> groups)
     {
        return groups.Select(group => new GroupModel(group)).ToList();
     }
    }

}

八个帖子:

using (wmswebEntities DbContext = new wmswebEntities())
                {
                    DbContext.Configuration.ProxyCreationEnabled = false;
            DbContext.Configuration.LazyLoadingEnabled = true;
                    DbContext.Database.Connection.Open();

                    List<Groups> myGroups = new List<Groups>();

                     var myGroups = from p in DbContext.Groups
                                where p.ActiveFlag = true
                                select new
                                {
                                    p.Groups.ApplicationName,
                                    p.Groups.GroupName,
                                    p.Groups.GroupRank,
                                    p.Groups.ActiveFlag,
                                    p.Groups.DateAdded,
                                    p.Groups.AddedBy,
                                    p.Groups.LastUpdated,
                                    p.Groups.LastUpdatedBy,
                                    p.Groups.ApplicationsGroupsLK.ApplicationID,
                                    p.Groups.UsersGroupsLK.UserNumber
                                };

                    return myGroups;
                }

【问题讨论】:

  • 如果我没有正确考虑这一点,那么我非常感谢与您交谈,以便我更好地了解您的解决方案...
  • 所以您有一个项目网格,其中包含类别下拉列表?

标签: asp.net-mvc-4 telerik-grid entity-framework-4.3


【解决方案1】:

这需要稍微调整一下思路。 Grid 只接受平面模型。这类问题经常被问到,这里是一个入门答案:Kendo UI Grid - How to Bind to Child Properties

如果这没有帮助,请在此处发布更多代码,我可以与您一起解决。

【讨论】:

  • 特雷,非常感谢您的回答...是的,这是阻碍我的一件事。我将根据 EF 生成的模型编辑我的帖子并问你几个问题,或者如果可以的话,我真的很想在这篇帖子中与你进行一些实时互动......
  • 顺便说一句,我使用 Telerik asp.net ajax for mvc,而不是 kendoui 工具集。
  • Trey,我试图在上面的第六篇文章中遵循您的解决方案,但没有发生两件事。在我的“公共 GroupModel(GroupModel 组)”方法和 FlattenToThis 方法中,我没有通过 LazyLoading(已打开)获得任何智能感知,我收到错误消息:“不包含 Select 的定义... “如果我们能聊几分钟来纠正这个问题,我将非常感激。如果您看到我在代码中做错了一些简单的事情,请随时对此做出回应。期待您的回复...
  • Trey,请看我的第七篇文章。我无法让智能感知为延迟加载的子表工作。我也收到了这样的消息:“GroupModel 是一种方法,但像一种类型一样使用”,它的设置方式是可以理解的,它类似于一种方法。请帮忙.....
  • 看起来你可能正在把自己挖到一个更深的洞里。我假设您可以在我的个人资料中看到我的电子邮件地址。如果你今天下午愿意,我可以花 20-30 分钟在这上面。通过该地址给我发送电子邮件并设置join.me 会话以共享您的屏幕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多