如何在实体框架中首先使用代码时查询现有表

时间:2015-05-29 19:32:35

标签: asp.net-mvc entity-framework asp.net-mvc-4

我正在使用Entity Framework 6 Code First。我创建了一个单独的表来包含aspnet_Users表中的UserId和Department的字段。因此,与部门一起列出的用户只能访问这些部门。

由于我的所有表都是先通过代码生成的,并且正在使用db.context。成员资格和角色是MVC预先生成的表。如果我没有在db.context中的aspnet_Users表中获取UserId列表? aspnet表是通过实体框架中的脚本预先生成的。

如何在db.context之外的MVC中查询表?

3 个答案:

答案 0 :(得分:1)

您的DbContext将拥有Database财产。除此之外,您将发现一般SQL查询的两个重载:

DbRawSqlQuery    SqlQuery   (Type elementType, string sql, params object[] parameters);
DbRawSqlQuery<T> SqlQuery<T>(string sql, params object[] parameters);

例如:

var result = ctx.Database.SqlQuery<Foo>("select * from foo");

更多信息here

答案 1 :(得分:1)

由于您使用.Net会员资格,您可以随时拨打

MembershipProvider.GetAllUsers(int pageIndex, int pageSize, out int totalRecords)

然后从该结果生成UserIds列表。角色提供程序还使用Roles.GetAllRoles()方法提供类似的功能。

membership providerrole provider提供了许多有用的方法,希望能够为您提供所需的数据。如果你有更多的选择后,他们仍然没有你所拥有的。您可以使用db上下文来执行原始SQL。 See MSDN for more info

另一种选择是创建与这些表的DB结构匹配的其他实体类,并将它们添加到数据库上下文中。这种方法的缺点是它可以允许其他开发人员,甚至自己创建和更新用户和角色,而无需通过适当的提供程序,在这种情况下,您将失去一些功能。如果这是一个问题,您可以始终创建数据库视图并映射到该视图以确保只读访问。这是一个更多的开销,但确实给你类型安全和熟悉的方式来查询数据。

答案 2 :(得分:0)

以下是我为获得完整解决方案所做的工作:

查询数据:

 string sql = "Select UserId, UserName from aspnet_users where applicationid='" + Config.Instance.AppId() + "'";

 using (var context = new NameSystemContext())
 {
      var users = context.Database.SqlQuery<AspnetUser>(sql);
      ViewBag.UserId = new SelectList(users, "UserId", "UserName").ToList();
 }

在您的视图模型或某处定义一个类:

class AspnetUser
{


    [Key]
    //[Column(Order = 1)]
    public Guid UserId { get; set; }

    //[Key]
    //[Column(Order = 2)]
    public string UserName { get; set; }


}

// ViewBag.UserId可以在视图中使用

@Html.DropDownList("UserId", null, "Select...", htmlAttributes: new { @class = "form-control" })
相关问题