繁体   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