2014-10-26 96 views
0

我有兩個模型與一個外鍵,User和Farm連接。ADO.NET MVC查詢外鍵

我希望能夠選擇一個用戶使用查詢和類型:

@Model.Farm.FarmId 

在我看來。這不會工作,因爲農場道具爲空。

Null

這是我的兩個型號:

模型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!

謝謝!

+0

你試圖使用實體框架或裏面的東西相似...沒有實際使用它? – 2014-10-26 14:34:23

+0

對不起,你的意思是?我用CodeFirst使用實體框架創建了我的數據庫。現在即時嘗試使用查詢來訪問這個數據庫中的數據,而不是LINQ。 – Reft 2014-10-26 14:36:19

+0

使用Linq [。](http://stackoverflow.com/questions/26574049/ado-net-mvc-query-foreign-key?noredirect=1#comment41765855_26574049) – 2014-10-26 14:36:57

回答

1

添加一個連接到您的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; 
} 
+0

這是我正在尋找的答案:) Thhhaanks – Reft 2014-10-26 15:00:38

2

如果您想要使用普通的SqlConnection,請將實體框架完全丟棄。這不會幫助你。您添加到對象的元數據將不會使用。

即使使用實體框架,理論上也可以使用DbSet.SqlQuery或類似的方法來運行自定義SQL查詢並取回活動對象。我不認爲有一個記錄的方式來通過JOIN加載依賴關係。您最終只能使用延遲加載支持,例如枚舉事物時循環中的SELECT查詢。

如果您絕對必須使用您的複雜手動方式而不是簡單的Linq單行,那麼您想要的只是一個簡單的INNER JOIN(或者如果農場是可選的,則爲LEFT JOIN)。這樣,您將從每一行的Farm表中獲取所有字段。然後,您可以像使用其他字段一樣手動爲每個用戶實例化您的Farm對象。

ProTips:

  1. 使用using()與讀寫器,以確保它被關閉了,如果
  2. catch { }是不會幫你調試的事情,而不是正確。
  3. 如果您只希望得到一個結果,爲什麼要使用while循環?
+0

很高興知道,謝謝 – Reft 2014-10-26 14:54:39

0

如果您不想使用EntityFramework,則必須自己構建Farm對象。

嘗試加入用戶和農場來獲取連接到用戶農場對象:

select * from users u 
join farms f on u.farmid = f.farmid 
where username == @username 

,然後建立Farm對象。

+0

嘿!我已經嘗試過,並且加入查詢工作,但我不知道下一步該怎麼做。你認爲你可以給我更多的代碼,並告訴我你的意思?謝謝! – Reft 2014-10-26 14:50:40