【问题标题】:Displaying Many to Many Relationship in MVC view在 MVC 视图中显示多对多关系
【发布时间】:2016-10-17 16:14:15
【问题描述】:

我正在 MVC 中创建一个数据库驱动的应用程序,我的应用程序是一个“数据字典”,它显示报告以及这些报告中使用了哪些数据库表。我正在为 MVC 使用数据库优先方法。

我的数据库结构如下

*tblReport*
fldReportID
fldReportName
fldReportPurpose
fldOriginalSignOffDate

*tblDBTables*
fldTableID
fldTableName

*tblDBTablesUsed*
fldDBTablesUsedID
fldReportID
fldTableID

tblDBTablesUsed 是多对多链接表 IE 每个报表有多个表,每个表可以在多个报表中使用。

我想在 MVC 中创建一个视图页面,它显示基本报告信息(保存在 tblReport 中)以及有关该报告中使用的表的信息。

我为每个表创建了一个模型如下:

public partial class tblReport
{

    public int fldReportID { get; set; }
    public string fldReportName { get; set; }
    public string fldReportPurpose { get; set; }
    public Nullable<System.DateTime> fldOriginalSignOffDate { get; set; }

}


public partial class tblDBTable
{

    public int fldTableID { get; set; }
    public string fldTableName { get; set; }

}

public partial class tblDBTablesUsed
{
    public int fldTablesUsedID { get; set; }
    public Nullable<int> fldReportID { get; set; }
    public Nullable<int> fldTableID { get; set; }

    public virtual tblDBTable tblDBTable { get; set; }
    public virtual tblReport tblReport { get; set; }
}

还有我的 Dbcontext 类:

public partial class DataDictionaryEntities : DbContext
{

    public virtual DbSet<tblDBTable> tblDBTables { get; set; }
    public virtual DbSet<tblDBTablesUsed> tblDBTablesUseds { get; set; }
    public virtual DbSet<tblReport> tblReports { get; set; }

}

我创建了一个视图模型来保存我想在视图中显示的两个实体:

public class ReportViewModel
{

    public tblReport report = new tblReport();
    public IEnumerable<tblDBTable> dbtables;

}

最后,在我的报告控制器中,我创建了详细信息操作方法

    public ActionResult Details(int? id)
    {

        ReportViewModel rvm = new ReportViewModel();

        tblReport Report = db.tblReports.Find(id);

        //here we have an Ienumerable of the link table which gives us the table ID's used in this report
        IEnumerable<tblDBTablesUsed> DBTablesUsed = db.tblDBTablesUseds.Where(x => x.fldReportID == Report.fldReportID);


        //how to get the tables!?
        //DBTables = ??

        rvm.report = Report;
        rvm.dbtables = DBTables;

        return View(rvm);
    }

我正在努力获取相关表 - IEnumerable DBTablesUsed 保存他们的 ID,但我如何从 tblReport 获取这些 IDS 的记录?

【问题讨论】:

    标签: c# sql asp.net-mvc database model-view-controller


    【解决方案1】:

    如果我的理解正确,您希望获取多对多辅助表的所有子项。
    您可以做的是获取所有 tblDBTablesUsed 并使用它们通过 .Contains() 获取 tblDBTable 和 tblReports。

    public ActionResult Details(int? id)
    {
         ReportViewModel rvm = new ReportViewModel();
         tblReport Report = db.tblReports.Find(id);
         List<tblDBTablesUsed> DBTablesUsed = db.tblDBTablesUseds
             .Where(x => x.fldReportID == Report.fldReportID).ToList(); //execute DB query using ToList()
    
         List<tblReport> reports = db.tblReports
             .Where(rep => DBTablesUsed.Select(x => x.fldReportID).Contains(rep.fldReportID))
             .ToList();
         List<tblDBTable> tables= db.tblDBTables
             .Where(rep => DBTablesUsed.Select(x => x.fldTableName).Contains(rep.fldTableName))
             .ToList(); 
    
         rvm.report = reports;
         rvm.dbtables = tables;
    
         return View(rvm);
    }
    

    顺便说一句,你的命名约定很糟糕,而且你没有遵循任何 c# 命名风格,这使得你的代码难以阅读。

    【讨论】:

    • 您好,感谢您的回复。我得到“bool”不包含“ToList”的定义,并且找不到接受第一个参数类型“bool”的扩展方法“ToList”
    • 如果我更改为 List 报告 = db.tblReports .Where(rep => DBTablesUsed.Select(x => x.fldReportID).Contains(rep.fldReportID)) .ToList() ;
    • 然后我得到 EntityFramework.SqlServer.dll 中出现“System.NotSupportedException”类型的异常,但未在用户代码中处理其他信息:无法创建“DatabaseFirst.Models”类型的常量值。 tblDBTablesUsed'。此上下文仅支持原始类型或枚举类型。抱歉多位cmet,第一次在本站发帖,遇到一些问题!
    • @stevee1986 请将您的代码发布到公共存储库,我可能会为您提供更好的帮助。我发布的代码是在这里完成的,所以我无法检查它的正确性
    • [link]dotnetfiddle.net/VjI5BB 我已经评论了错误的位置以及其他一些 cmets / 问题 谢谢
    【解决方案2】:

    感谢卡米洛的帮助。

    我已经设法得到解决方案:

        public ActionResult Details(int? id)
        {
    
            ReportViewModel rvm = new ReportViewModel();
    
            tblReport report = db.tblReports.Find(id);
            List<tblDBTable> tablesinreport = new List<tblDBTable>();
    
            // get tables used in this report
            IQueryable<tblDBTable> ReportTables = from t1 in db.tblDBTablesUseds
                                                  join t2 in db.tblDBTables on t1.fldTableID equals t2.fldTableID
                                                  where t1.fldReportID == id
                                                  select t2;
            tablesinreport= ReportTables.ToList();
    
    
            rvm.report = report;
            rvm.dbtables = tablesinreport;
    
            return View(rvm);
    
        }
    

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 2014-03-29
      • 1970-01-01
      • 2021-11-13
      相关资源
      最近更新 更多