1

コントローラーとビューからテーブルにアクセスする方法を知りたいと思います。

私のモデルはそのように見えます

public class UserProfiles
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    public string UserName { get; set; }

    public virtual ICollection<Roles> Roles { get; set; } //many to many
    public virtual ICollection<dbClient> Clients { get; set; } // many to many

}

私の他のモデルは次のようになります

public class Roles
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [Required(ErrorMessage = "Required")]
    public int RoleID { get; set; }
    [Required(ErrorMessage = "Required")]
    public string RoleName { get; set; }

    public virtual ICollection<UserProfiles> UserProfiles { get; set; } //many to many

}

PMC (パッケージ マネージャー コンソール) から移行と更新を実行すると、両方のテーブルの ID 値を保持する 3 番目のテーブルにキーを持つ 2 つのテーブルが作成されます。

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<OilNGasWeb.Models.Roles>()
            .HasMany<OilNGasWeb.Models.UserProfiles>(r => r.UserProfiles)
            .WithMany(u => u.Roles)
            .Map(m =>
            {
                m.ToTable("Webpages_UsersInRoles");
                m.MapLeftKey("RoleId");
                m.MapRightKey("UserId");
            });
    }

ここに画像の説明を入力ここに画像の説明を入力

最近私は試しました:

var result=(from u in db.UserProfiles 
                from r in u.Roles  **1.**    
                where r.RoleID.Contains(u.UserId) **2.** 
                select u);

しかし、どういうわけかWebpages_UsersInRolesを拾っていません...(テーブルを作成した後、そのためのクラスを作成する必要があります???? )

なぜ私はそれにリンクできないのですか?


@Andrew Countsの2枚の写真

ここに画像の説明を入力 ここに画像の説明を入力


m2mテーブルを取得するために私が従った手順

最初に多対多の EF コードを生成する

その後、次の例を使用してみました:

ビューで m2m 作業を行う

m2m

m2m コントローラーの更新

これらすべてを読みましたが、コントローラーレベルからm2mを使用する方法はわかりませんか? ビューに値を渡します。

助けてくれてありがとう

4

2 に答える 2

1

それらはあなたのために「魔法のように」作られたわけではありません。ユーザーとロールは ASP.NET メンバーシップ テーブルです。これらは、アプリケーションではなく、ASP.NET メンバーシップを通じて管理するように設計されています。ただし、それはアプリケーションがそれらを管理できないという意味ではありません。基本レベルでは、それらはデータベース内の単なるテーブルであるため、EF の Database First 設計に従って操作するだけです。実際に必要なのは、モデルで使用するテーブルを手動で指定し、それらのモデルを持つコンテキストで EF のデータベース初期化子をオフにすることだけです。

最初に、メンバーシップ テーブルを近似するクラスを作成します。Visual Studio でこれらを生成することもできますが、アプリケーションの残りの部分が Code First である場合、.edmx ファイルがうまく混ざり合わないことになります。それらを自分で作成することは難しくありません。データベース テーブルを見て、同じ名前の同じ型のクラスにプロパティを作成するだけです。

クラスを作成したら、[Table]属性でそれを装飾する必要があります。たとえば、Membershipクラスで:

[Table("webpages_Membership")]
public class Membership
{
    ...
}

次に、新しいコンテキストを作成する必要があります。好きな名前を付けることができますが、次のように近似する必要があります。

public class MembershipContext : DbContext
{
    public MembershipContext()
        : base("name=YourConnectionStringName")
    {
        Database.SetInitializer<MembershipContext>(null);
    }

    public DbSet<Membership> Memberships { get; set; }
    ...
}

カスタム コンストラクターは 2 つのことを行います。1) 適切なデータベースへの接続に使用する接続文字列名を渡します。2) EF のデータベースの初期化をオフにするため、移行を行うように求められず、移行を試みません。ドロップしてデータベースを再作成しようとするようなクレイジーなこと。これが、コードの最初のモデルが使用しているコンテキストとは異なるコンテキストである必要がある理由です。

本当にそれだけです。ここで、コントローラーでこのコンテキストのインスタンスを作成し、他のコンテキストを使用するのと同じように使用します。

于 2013-08-01T18:35:31.313 に答える