2016-01-27 75 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