1

私はasp.net mvc 4、EF、codefirstを使用して、ユーザーとロールシステムとの多対多の関係を構築しています

ユーザーモデル:

public class User
{
    #region properties

    [Key]
    public Int32 Id { get; set; }

    [Required]
    public String UserName { get; set; }

    public String Password { get; set; }

    [Required]
    public String Email { get; set; }

    public DateTime CreationDate { get; set; }

    public   DateTime LastUpdate { get; set; }

    public DateTime? LastLogin { get; set; }

    [ForeignKey("RoleId")]
    public virtual ICollection<Role> Roles { get; set; }

    #endregion //properties

    #region constructors

    public User()
    {
        Roles = new HashSet<Role>();

        LastUpdate = DateTime.Now;
        CreationDate = DateTime.Now;
    }

    #endregion //constuctors
}

ロールモデル:

public class Role
{
    [Key]
    public Int32 Id { get; set; }
    public String Name { get; set; }
    public String Description { get; set; }
    public DateTime CreationDate { get; set; }
    public DateTime LastUpdate { get; set; }

    [ForeignKey("UserId")]
    public virtual ICollection<User> Users { get; set; }

    public Role() 
    {
        Users = new HashSet<User>();

        CreationDate = DateTime.Now;
        LastUpdate = DateTime.Now;
    }
}

コンテキスト:

public class UserManagementContext : Context, IContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }

    public UserManagementContext() {
        Database.SetInitializer<UserManagementContext>(null);
    }

    void IContext.Setup(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().ToTable("Users");
        modelBuilder.Entity<Role>().ToTable("Roles");   
        modelBuilder.Entity<User>()
            .HasMany(u => u.Roles)
            .WithMany(r => r.Users)
            .Map(
                m =>
                {
                    m.MapLeftKey("UserId");
                    m.MapRightKey("RoleId");
                    m.ToTable("UserRoles");
                });
    }
}

データベース テーブルが生成されると、テーブル users、roles、および userroles が存在します。次に、ユーザーにレコードを作成し、ロールに 1 つ、ユーザーロールに 1 つ、それらを接続します。userroles テーブルには、RoleId と UserId の 2 つの列があります。

次に、次のようにユーザーのロールをロードしようとします。

public String[] GetRoles(String userName)
    {           
        //var user = ConcreteContext.Users.Include("Roles").Where(u => u.UserName == userName).FirstOrDefault();
        var users = ConcreteContext.Users.Include(u => u.Roles);
        var user = users.FirstOrDefault();

        var roles = from r in user.Roles
                    select r.Name;
        return roles.ToArray();
    }

しかし、 の行でvar users = ConcreteContext.Users.Include(u => u.Roles);は次のエラーが発生します。

System.Data.SqlClient.SqlException: Invalid object name 'dbo.RoleUsers'.

データベースを作成するときに (を使用して) UserRoles のテーブル名を RoleUsers に変更するとm.ToTable(RoleUsers)、間違ったフィールド名に関するさまざまなエラーが発生します。

ここで何が欠けているのか誰にも分かりますか?

前もって感謝します、

ウィレム

4

2 に答える 2

3

Fluent API を使用しなければならない理由はありますか?

データ属性を使用して、次のように多対多をマップできます。

public class User
{
    [InverseProperty( "Users" )]
    public virtual ICollection<Role> Roles {get;set;}
}

public class Role
{
    [InverseProperty( "Roles" )]
    public virtual ICollection<User> Users {get;set;}
}
于 2013-01-23T21:07:03.687 に答える
0

これは私が必要としたことを行います:

public class User
{
    #region properties

    [Key]
    public Int32 Id { get; set; }

    [Required]
    public String UserName { get; set; }

    public String Password { get; set; }

    [Required]
    public String Email { get; set; }

    public DateTime CreationDate { get; set; }

    public   DateTime LastUpdate { get; set; }

    public DateTime? LastLogin { get; set; }

    [InverseProperty("Users")]
    public virtual ICollection<Role> Roles { get; set; }

    #endregion //properties

    #region constructors

    public User()
    {
        LastUpdate = DateTime.Now;
        CreationDate = DateTime.Now;
    }

    #endregion //constuctors
}

    public class Role
{
    [Key]
    public Int32 Id { get; set; }
    public String Name { get; set; }
    public String Description { get; set; }
    public DateTime CreationDate { get; set; }
    public DateTime LastUpdate { get; set; }

    [InverseProperty("Roles")]
    public virtual ICollection<User> Users { get; set; }

    public Role() 
    {
        CreationDate = DateTime.Now;
        LastUpdate = DateTime.Now;
    }
}

public class UserManagementContext : Context, IContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }

    public UserManagementContext() {
        Database.SetInitializer<UserManagementContext>(null);
    }

    void IContext.Setup(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().ToTable("Users");
        modelBuilder.Entity<Role>().ToTable("Roles");               
    }
}
于 2013-01-27T13:00:26.347 に答える