2014-10-26 3 views
0

У меня есть две модели, связанные с внешним ключом, пользователем и фермой.ADO.NET MVC Query external key

Я хочу, чтобы иметь возможность выбрать пользователя с запросом и типа:

@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; } 
} 

GET запрос пользователя:

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

Вы пытаетесь использовать Entity Framework или что-то похоже ... без его использования? –

+0

Извините, что вы имеете в виду? Я создал свою базу данных с помощью codefirst, используя Entity Framework. Теперь я пытаюсь получить доступ к данным из этой базы данных с помощью запросов, а не linq. – Reft

+0

Используйте Linq [.] (Http://stackoverflow.com/questions/26574049/ado-net-mvc-query-foreign-key?noredirect=1#comment41765855_26574049) –

ответ

1

Добавить присоединиться к вашему 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; 
} 
+0

Это ответ, который я искал :) Thhhaanks – Reft

2

Если вы хотите использовать простой SqlConnection, то полностью интегрируйте Entity Framework. Это тебе не поможет. Метаданные, добавленные вами к объектам, не будут использоваться.

Даже с платформой Entity Framework теоретически можно использовать DbSet.SqlQuery или аналогичный метод для запуска пользовательских SQL-запросов и возврата живых объектов. Я не думаю, что есть документированный способ удовлетворения зависимостей загрузки через JOIN. В конечном итоге вы получите ленивую поддержку загрузки, то есть SELECT запросы в цикле, когда вы перечисляете все.

Если вы абсолютно должны использовать свой сложный ручной способ вместо простого Linq с одним слоем, то то, что вы хотите, это просто INNER JOIN (или LEFT JOIN, если ферма не является обязательной). Таким образом вы получите все поля из таблицы Farm на каждой строке. Затем вы можете вручную создать экземпляр объекта Farm для каждого Пользователя так же, как и с остальными полями.

ProTips:

  1. Используйте using() с читателем, чтобы убедиться, что он закрывается должным образом, а не ваш, если
  2. Пустой catch { } не собирается, чтобы помочь вам отладить вещи.
  3. Зачем использовать цикл while, если вы ожидаете только одного результата?
+0

Полезно знать, спасибо – Reft

0

Если вы не хотите использовать EntityFramework, вы должны сами построить объект Farm.

Попробуйте присоединиться к пользователю и ферму, чтобы получить объект фермы, который подключен к пользователю:

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

А затем построить объект фермы.

+0

Эй! Я пробовал это раньше и получил запрос на соединение, но я не знаю, что делать дальше. Вы думаете, что можете дать мне еще код и показать мне, что вы имеете в виду? Благодаря! – Reft