我正在使用Entity Framework 6 Code First。我创建了一个单独的表来包含aspnet_Users表中的UserId和Department的字段。因此,与部门一起列出的用户只能访问这些部门。
由于我的所有表都是先通过代码生成的,并且正在使用db.context。成员资格和角色是MVC预先生成的表。如果我没有在db.context中的aspnet_Users表中获取UserId列表? aspnet表是通过实体框架中的脚本预先生成的。
如何在db.context之外的MVC中查询表?
答案 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 provider和role 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" })