2

我是 ASP.NET MVC4 的新手。这是我的问题:

我有两个表如下:

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

`Roles(Id, Name)`

哪个Users.RoleId是外键引用Roles.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.

是什么导致了问题以及如何解决这个问题?

4

2 回答 2

1

试试这样:

using (var db = new Database())
{
    ViewBag.Users = db.Users.Include("Role").ToList();
}
于 2013-09-28T17:10:46.060 回答
1

上面的建议很好。但是,错误消息意味着当您尝试从用户访问角色属性时,您已经关闭了连接。它应该可以工作,因为您将其声明为“虚拟”,这意味着您想要延迟加载。

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

当您尝试使用“使用”来包装数据库连接时,您已经在语句之后释放了连接。如果您稍后可以关闭连接,则此处不需要包含。

于 2013-09-28T18:09:55.530 回答