2

私は ASP.NET MVC4 の初心者です。これは私の問題です:

次のように2つのテーブルがあります。

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

これで、DB 内のすべてのユーザーを次のように選択できます。

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

ビューに表示します。

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

butステートメント:@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.ToList();
}

「using」を使用してデータベース接続をラップしようとすると、ステートメントの後に接続が破棄されます。後で接続を閉じることができる場合は、ここに含める必要はありません。

于 2013-09-28T18:09:55.530 に答える