[英]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.