如何在 MVC 中使用 DB First Approach 从 Junction Table 获取数据
How to get data from Junction Table using DB First Approach in MVC
我有 2 个 table 之间的多对多关系,我想从联结点 table 检索数据。
我先分享一些资源
数据库图像 tables:
EF 模型实体图片:
调试时的错误图片:
我正在使用以下规则或策略
+数据库优先
+EF图
+自定义角色提供者
问题是,当我尝试从 Junction Table (user_has_role) 检索数据时,我得到的是 SQL 查询而不是数据。###
SQL 我得到的查询:
SELECT \r\n [Extent1].[user_id] AS [user_id], \r\n [Extent2].[user_role_name] AS [user_role_name]\r\n FROM [dbo].[user_has_role] AS [Extent1]\r\n INNER JOIN [dbo].[user_role] AS [Extent2] ON [Extent1].[user_role_id] = [Extent2].[user_role_id]
这是一些代码
角色提供者 Class 派生自角色提供者 Class
public class AppRolesProvider : RoleProvider
所有方法都被覆盖但仅适用于
public override string[] GetRolesForUser(string username)
{
//get all user data from user table for id based on user email
var _user = db.users.Where(u => u.user_email == username).FirstOrDefault();
var _role = (from s in db.users
where (
from c in s.user_role
where s.user_id == _user.user_id
select c
).Any()
select s).ToString();
string[] roleName = { _role };
if (roleName != null)
{
return roleName;
}
else
{
roleName = null;
return roleName;
}
}
我想要针对用户的实际角色名称(一个用户有多个角色,也可能只有一个)
已更新
Updated db image
并尝试从联结点 table 检索数据,但收到此查询
"SELECT \r\n [Extent1].[user_id] AS [user_id], \r\n [Extent2].[user_role_name] AS [user_role_name]\r\n FROM [dbo].[user_has_role] AS [Extent1]\r\n INNER JOIN [dbo].[user_role] AS [Extent2] ON [Extent1].[user_role_id] = [Extent2].[user_role_id]\r\n WHERE [Extent1].[user_id] = @p__linq__0"
不是数据
这是我在字符串数组中获取角色的方法
public override string[] GetRolesForUser(string username)
{
//get all user data from user table for id based on user email
int _user_id = Convert.ToInt32(db.users.Where(u => u.user_email == username).Select(i => i.user_id).FirstOrDefault());
// Get role from user_has_role against user id
var _roles = (from _uhr in db.user_has_role
join _r in db.user_role on _uhr.user_role_id equals _r.user_role_id
where _uhr.user_id == _user_id
select new
{
_r.user_role_name
}).ToString();
// store selected
string[] roleName = { _roles };
if (roleName != null)
{
return roleName;
}
else
{
roleName = null;
return roleName;
}
}
output image in debug mode
已更新
EDMX Image
联结 table 未包含在 Entity Framework 中,因为它没有主键。您通过向联结点添加主键来解决此问题 table 然后更新您的 Edmx 文件。
更新模型后,您可以使用简单的 linq 查询从联结 table 检索数据。
两种情况的区别:
1) 如果您的连接 table 不包含主键,EF 将生成两个具有多对多关系
的 class
2) 如果您的联结 table 包含一个主键,EF 将生成 3 Class 与: 联结 table 与用户一对多关系,一对多与 user_role
更新
请试试这个:
public override string[] GetRolesForUser(string username)
{
//get all user data from user table for id based on user email
int _user_id = Convert.ToInt32(db.users.Where(u => u.user_email == username).Select(i => i.user_id).FirstOrDefault());
// Get role from user_has_role against user id
var _role = db.user_has_role.Where(r => r.user_id == _user_id).Select(r => r.user_role.user_role_name);
// store selected
string[] roleName = _role.ToArray();
if (roleName != null)
{
return roleName;
}
else
{
roleName = null;
return roleName;
}
}
我有 2 个 table 之间的多对多关系,我想从联结点 table 检索数据。
我先分享一些资源
数据库图像 tables:
EF 模型实体图片:
调试时的错误图片:
我正在使用以下规则或策略
+数据库优先
+EF图
+自定义角色提供者
问题是,当我尝试从 Junction Table (user_has_role) 检索数据时,我得到的是 SQL 查询而不是数据。###
SQL 我得到的查询:
SELECT \r\n [Extent1].[user_id] AS [user_id], \r\n [Extent2].[user_role_name] AS [user_role_name]\r\n FROM [dbo].[user_has_role] AS [Extent1]\r\n INNER JOIN [dbo].[user_role] AS [Extent2] ON [Extent1].[user_role_id] = [Extent2].[user_role_id]
这是一些代码
角色提供者 Class 派生自角色提供者 Class
public class AppRolesProvider : RoleProvider
所有方法都被覆盖但仅适用于
public override string[] GetRolesForUser(string username)
{
//get all user data from user table for id based on user email
var _user = db.users.Where(u => u.user_email == username).FirstOrDefault();
var _role = (from s in db.users
where (
from c in s.user_role
where s.user_id == _user.user_id
select c
).Any()
select s).ToString();
string[] roleName = { _role };
if (roleName != null)
{
return roleName;
}
else
{
roleName = null;
return roleName;
}
}
我想要针对用户的实际角色名称(一个用户有多个角色,也可能只有一个)
已更新
Updated db image
并尝试从联结点 table 检索数据,但收到此查询
"SELECT \r\n [Extent1].[user_id] AS [user_id], \r\n [Extent2].[user_role_name] AS [user_role_name]\r\n FROM [dbo].[user_has_role] AS [Extent1]\r\n INNER JOIN [dbo].[user_role] AS [Extent2] ON [Extent1].[user_role_id] = [Extent2].[user_role_id]\r\n WHERE [Extent1].[user_id] = @p__linq__0"
不是数据
这是我在字符串数组中获取角色的方法
public override string[] GetRolesForUser(string username)
{
//get all user data from user table for id based on user email
int _user_id = Convert.ToInt32(db.users.Where(u => u.user_email == username).Select(i => i.user_id).FirstOrDefault());
// Get role from user_has_role against user id
var _roles = (from _uhr in db.user_has_role
join _r in db.user_role on _uhr.user_role_id equals _r.user_role_id
where _uhr.user_id == _user_id
select new
{
_r.user_role_name
}).ToString();
// store selected
string[] roleName = { _roles };
if (roleName != null)
{
return roleName;
}
else
{
roleName = null;
return roleName;
}
}
output image in debug mode
已更新
EDMX Image
联结 table 未包含在 Entity Framework 中,因为它没有主键。您通过向联结点添加主键来解决此问题 table 然后更新您的 Edmx 文件。
更新模型后,您可以使用简单的 linq 查询从联结 table 检索数据。
两种情况的区别:
1) 如果您的连接 table 不包含主键,EF 将生成两个具有多对多关系
的 class
2) 如果您的联结 table 包含一个主键,EF 将生成 3 Class 与: 联结 table 与用户一对多关系,一对多与 user_role
更新
请试试这个:
public override string[] GetRolesForUser(string username)
{
//get all user data from user table for id based on user email
int _user_id = Convert.ToInt32(db.users.Where(u => u.user_email == username).Select(i => i.user_id).FirstOrDefault());
// Get role from user_has_role against user id
var _role = db.user_has_role.Where(r => r.user_id == _user_id).Select(r => r.user_role.user_role_name);
// store selected
string[] roleName = _role.ToArray();
if (roleName != null)
{
return roleName;
}
else
{
roleName = null;
return roleName;
}
}