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(包管理器控制台)运行迁移和更新时,它会将带有键的 2 个表创建到第三个表中,该表保存两个表的 ID 值。

 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 上出现......(在它为我创建表之后,我必须为它创建一个类吗????)

为什么我不能链接到它。


2@Andrew Counts 的图片

在此处输入图像描述 在此处输入图像描述


我遵循的步骤来获取 m2m 表

首先生成多对多 EF 代码

之后我尝试使用以下示例:

让 m2m 与视图一起工作

平方米

m2m 控制器更新

我阅读了所有这些以及更多内容,但没有说如何从控制器级别使用 m2m?将值传递到视图中。

谢谢你的帮助

4

2 回答 2

1

.Include()扩展方法是您所缺少的。Julie Lerman 在MSDN上写了一篇很棒的文章,讨论了加载相关数据、.Include()扩展方法、虚拟关键字等。

如果我要重新编写您的查询,我可能会从

var model = from u in db.UserProfiles
    .Include("Roles")
    .Where(u.Roles.Where(r => r.RoleID != 1 && r.RoleID != null))
    .Select u;

这些方面的东西应该返回您期望的结果。

于 2013-08-01T19:14:05.997 回答
1

它们不是为您“神奇地”制作的;用户和角色是 ASP.NET 成员表。它们旨在通过 ASP.NET Membership 进行管理,而不是您的应用程序。但是,这并不意味着您的应用程序无法管理它们。在基本级别上,它们只是数据库中的表,因此您可以简单地遵循 EF 的数据库优先设计与它们进行交互。真正需要的是手动指定要在模型上使用的表,并在具有这些模型的上下文中关闭 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; }
    ...
}

自定义构造函数做了两件事:1)它传递连接字符串名称以用于连接到正确的数据库,2)它关闭 EF 的数据库初始化,因此不会提示您进行迁移,也不会尝试执行一些疯狂的事情,比如 drop 并尝试重新创建您的数据库。这就是为什么它需要与您的代码优先模型使用的上下文不同的原因。

这就是它的全部。现在,您只需在控制器中创建此上下文的实例并像使用任何其他上下文一样使用它。

于 2013-08-01T18:35:31.313 回答