簡體   English   中英

ADO.NET MVC查詢外鍵

[英]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對象。

提示:

  1. 與讀者一起使用using() ,以確保其正確關閉,而不是if
  2. 空的catch { }不會幫助您調試。
  3. 如果只期望一個結果,為什么要使用while循環?

如下所示將聯接添加到您的SQL查詢中

string sql = "SELECT * FROM Users JOIN Farm ON Farm.FarmId = Users.FarmId WHERE UserName = @UserName";

然后創建Farm的實例並將其分配給user.Farmwhile (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM