2013-09-28 113 views
2

我是ASP.NET MVC4中的新手。這是我的問題:簡單實體框架導航錯誤

我有兩個表如下:

`Users(Username, Password, Email, RoleId)` 

`Roles(Id, Name)` 

Users.RoleIdRoles.Id

外鍵引用這是我的課:

[Table("Users")] 
public class User 
{ 
    [Key, Required, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    [StringLength(20)] 
    public string Username { get; set; } 

    [StringLength(32), Required] 
    public string Password { get; set; } 

    [StringLength(70), Required] 
    public string Email { get; set; } 

    public int RoleId { get; set; } 

    public virtual Role Role { get; set; } 
} 

[Table("Roles")] 
public class Role 
{ 
    public Role() 
    { 
     Users = new HashSet<User>(); 
    } 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public int Id { get; set; } 

    [StringLength(30)] 
    public string Name { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
} 

public class Database : DbContext 
{ 
    public Database() 
     : base("WebstoreDbConnectionString") 
    { 
    } 

    public DbSet<User> Users { get; set; } 
    public DbSet<Role> Roles { get; set; } 
} 

現在,我可以在我的數據庫與選擇所有用戶:

using (var db = new Database()) 
{ 
    ViewBag.Users = db.Users.ToList(); 
} 

,並顯示在視圖:

@foreach(var user in ViewBag.Users) { 
    <p>@user.Username | @user.Password</p> 
} 

但是聲明:@user.Role.Name給我一個錯誤:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. 

問題的原因是什麼以及如何解決這個問題?

回答

1

以上的建議是很好的。但是,錯誤消息意味着您在嘗試訪問用戶的角色屬性時已關閉連接。它應該工作,因爲你聲明它爲「虛擬」,這意味着你想要延遲加載。

using (var db = new Database()) 
{ 
    ViewBag.Users = db.Users.ToList(); 
} 

當您嘗試使用「using」來包裝數據庫連接時,您已經在語句後面放置了連接。如果您稍後可以關閉連接,則不需要此處的包含。

+0

也許你應該在技術上添加這是可能的,但它不是一個通常推薦的方法。 –

+0

通常情況下,您將使用http請求關聯上下文,因此您將在http請求結束時關閉數據庫上下文,並且在這種情況下延遲加載將會起作用。就我個人而言,我不是懶惰加載的粉絲 –

+0

我明白了,非常感謝你! –

1

嘗試這樣的:

using (var db = new Database()) 
{ 
    ViewBag.Users = db.Users.Include("Role").ToList(); 
} 
+0

謝謝你,幕後的魔術是什麼?所以,如果我想讓所有的用戶都在一個角色中,我必須做'db.Roles.Include(「Users」)。Where(...)'?有什麼方法可以刪除'Include'? –

+0

EF創建最簡單的查詢就可以了。如果你不需要角色,它不加入輔助表,如果你想角色它創建一個內部聯接,但你需要用Include來說。 – Pascalz