【问题标题】:Cant view Index Action for displaying data in MVC无法查看用于在 MVC 中显示数据的索引操作
【发布时间】:2016-01-27 11:23:31
【问题描述】:

我在两个表中的插入成功,但在显示数据的索引操作时出现错误。

模型和视图模型。

查看模型

public class VMUsers
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public string LastName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
}

型号

[Table("tblUsers")]
public class Users
{   
    [Key]
    public int Id { get; set; }
    public string FullName { get; set; }
    public string LastName { get; set; }
}

[Table("tblUserDetails")]
public class UserDetails
{
    [Key]
    public int Id { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }

    public int UserID { get; set; }
}

数据库集

public System.Data.Entity.DbSet<MVCLearning.Models.VMUsers> Combination { get; set; }

索引操作

public ActionResult Index()
    {
        return View(db.Combination.ToList());
        
    }

获取异常

EntityFramework.SqlServer.dll 中出现“System.Data.Entity.Core.EntityCommandExecutionException”类型的异常,但未在用户代码中处理

附加信息:执行命令定义时出错。有关详细信息,请参阅内部异常。

无法理解这个内部异常是什么。

它会中断,因此查看错误的调试部分也会中断,它不会转到视图进行调试。

【问题讨论】:

  • VMUsers 是视图模型,而不是数据模型。它应该与 EF 没有任何关系。
  • 另外,你确定你的实体模型定义是正确的吗?表之间有足够的外键关系吗?
  • 好像现在正在练习在两个表中添加数据,所以保持简单,没有保留 PK 和 FK,但实时 PK 和 FK 会在那里。

标签: c# entity-framework asp.net-mvc-4


【解决方案1】:

您应该做的一件事是在实体之间创建导航属性,但首先我认为您正在尝试在UserUserDetail 之间创建一对一的关系。如果是这种情况,从属实体的 PK(在本例中为 UserDetail)也应该是您关系的 FK。你的模型应该是这样的:

[Table("tblUsers")]
public class Users
{   
    [Key]
    public int Id { get; set; }
    public string FullName { get; set; }
    public string LastName { get; set; }

    public virtual UserDetail Detail { get; set; }
}

[Table("tblUserDetails")]
public class UserDetails
{
    [Key,ForeignKey("User")]
    public int UserId { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }

    public virtual User User { get; set; }
}

现在必须使用您的实体类型定义上下文中的 DBSet&lt;TEntity&gt; 属性:

public DbSet<MVCLearning.Models.User> Users { get; set; }
public DbSet<MVCLearning.Models.UserDetail> UserDetails { get; set; }

现在,您可以在控制器中声明这样的查询,将结果投影到您的 VM 类中:

public ActionResult Index()
{
    return View(db.Users.Select(u=>new VMUsers{ Id=u.Id,
                                                FullName=u.FullName,
                                                LastName=u.LastName,
                                                Address2=u.Detail.Address1,
                                                Address1=u.Detail.Address2}));

}

【讨论】:

  • 为什么要公开虚拟 UserDetail Detail { get;放; } 和公共虚拟用户用户 { 获取;放; } 见过很多开发者使用 virtual 关键字来做这件事,但不了解它的重要性。
  • 这是延迟加载的要求。检查此post,并在此msdn 页面中详细说明您需要满足的所有要求。
  • 从您的回复中学到了很多。
猜你喜欢
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多