2016-01-27 45 views
0

我在两个表中插入是成功的,但我在索引操作中出现错误以显示数据。无法查看索引在MVC中显示数据的操作

模型和视图模型。

视图模型

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; } 
} 

DBSet

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

索引操作

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

    } 

入门例外

类型“System.Data.Entity.Core.EntityCommandExecutionException”的一个例外发生在EntityFramework.SqlServer.dll但在用户代码中没有处理

其他信息:在执行时发生错误命令定义。详情请参阅内部例外。

不知道这是什么内在的excepton。

它打破了,所以看到错误的调试部分也打破了它不去视图调试。

+2

'VMUsers'是一个视图模型,而不是数据模型。它不应该与EF有任何关系。 –

+0

另外,你确定你的实体模型定义是正确的吗?表格之间是否有足够的外键关系? – Shyju

+0

好像现在正在考虑在两张表中添加数据,所以保持简单,没有保存PK和FK,但实时PK和FK将在那里。 – Dave

回答

2

你应该做的一件事是在你的实体之间创建导航属性,但首先我想你试图创建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<TEntity>属性必须使用您的实体类型来定义:

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})); 

} 
+0

为什么公共虚拟UserDetail Detail {get;组; }和公共虚拟用户用户{get;组; }已经看到很多开发人员用虚拟关键词来做这件事,但并没有理解它的重要性。 – Dave

+0

这是延迟加载的要求。检查这[后](http://stackoverflow.com/questions/5597760/what-effects-can-the-virtual-keyword-have-in-entity-framework-4-1-poco-code-fi),和在此[msdn](https://msdn.microsoft.com/library/dd468057(v = vs.110).aspx)页面中详细解释了您需要满足的所有要求。 – octavioccl

+0

从您的回复中了解到很多。 – Dave