2014-10-26 98 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