[英]ADO.NET MVC Query foreign key
我有两个与外键关联的模型:User和Farm。
我希望能够通过查询选择用户并输入:
@Model.Farm.FarmId
在我看来。 这将不起作用,因为农场道具为空。
这是我的两个模型:
模型1:
public class User
{
[Key]
public int UserId { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string PasswordSalt { get; set; }
public int Money { get; set; }
public int FarmId { get; set; }
[ForeignKey("FarmId")]
public virtual Farm Farm { get; set; }
}
模型2:
public class Farm
{
public Farm()
{
User = new HashSet<User>();
}
[Key]
public int FarmId { get; set; }
public DateTime Created { get; set; }
public int Age { get; set; }
public virtual ICollection<User> User { get; set; }
}
获取用户查询:
public User GetUser(string userName)
{
string sql = "SELECT * FROM Users WHERE UserName = @UserName";
User user = null;
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
try
{
SqlCommand cmd = new SqlCommand(sql, connection);
cmd.Parameters.AddWithValue("@userName", userName);
connection.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
user = new User
{
UserId = (int)rdr["UserId"],
UserName = (string)rdr["UserName"],
Password = (string)rdr["Password"],
PasswordSalt = (string)rdr["PasswordSalt"],
Money = (int)rdr["Money"],
FarmId = (int)rdr["FarmId"],
Farm ??????
};
}
if (rdr != null)
rdr.Close();
}
catch
{
}
}
return user;
}
我的猜测是我必须进行某种加入,对吗? 我仍然是新手,请耐心等待:)
我不想使用linq!
谢谢!
如果要使用普通的SqlConnection
,则完全SqlConnection
实体框架。 它不会帮助您。 您添加到对象中的元数据将不使用。
即使使用Entity Framework,理论上您也可以使用DbSet.SqlQuery
或类似方法来运行自定义SQL查询并获取活动对象。 我不认为有记录的方式可以通过JOIN渴望加载依赖项。 您最终只会得到延迟加载支持,即枚举时在循环中进行SELECT查询。
如果您绝对必须使用复杂的手动方式而不是简单的Linq单缸纸,那么您想要的是一个简单的INNER JOIN
(如果Farm是可选的,则是LEFT JOIN
)。 这样,您还将从每一行的“农场”表中获取所有字段。 然后,您可以使用与其余字段相同的方式为每个用户手动实例化Farm对象。
提示:
using()
,以确保其正确关闭,而不是if catch { }
不会帮助您调试。 while
循环? 如下所示将联接添加到您的SQL查询中
string sql = "SELECT * FROM Users JOIN Farm ON Farm.FarmId = Users.FarmId WHERE UserName = @UserName";
然后创建Farm
的实例并将其分配给user.Farm
在while (rdr.Read())
块中
while (rdr.Read())
{
user = new User
{
UserId = (int)rdr["UserId"],
UserName = (string)rdr["UserName"],
Password = (string)rdr["Password"],
PasswordSalt = (string)rdr["PasswordSalt"],
Money = (int)rdr["Money"],
FarmId = (int)rdr["FarmId"]
};
Farm farm = new Farm();
farm.FarmId = (int)rdr["FarmId"];
farm.Created = (DateTime)rdr["Created"];
farm.Age = (int)rdr["Age"];
user.Farm = farm;
}
如果您不想使用EntityFramework,则必须自己构建Farm对象。
尝试加入用户和服务器场以获取连接到该用户的服务器场对象:
select * from users u
join farms f on u.farmid = f.farmid
where username == @username
然后建立Farm对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.