C# - Web API(外键)
C# - Web API (Foreign Key)
我有一个包含两个 table 的数据库——用户、聊天室。我的聊天室 table 看起来像这样:
created_by 列有一个外键将其连接到用户 table 主键 (id int(11))
用户table:
(密码不用管,只是原型)
现在我想做这样的事情:
public class Chatroom
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public User Created_by { get; set; }
public Chatroom(int id, string name, string description, User created_by)
{
Id = id;
Name = name;
Description = description;
Created_by = created_by;
}
}
和 ApiController:
MySqlCommand command = new("SELECT id, name, description, created_by FROM chatrooms", connection);
MySqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
results.Add(new Chatroom(
(int)reader["Id"],
reader["Name"].ToString(),
reader["Description"].ToString(),
(User)reader["created_by"]
));
}
现在这显然是行不通的,因为created_by是Int32类型,而不是User,并且用户的id存储在那里,而不是用户自己。所以我的问题是,我将如何访问用户本身。谢谢。
您需要更改 select 语句以从用户 table:
获取创建聊天室的用户的数据
SELECT id, name, description, created_by, users.Name, users.Surname, users.Email, users.Password FROM
chatrooms, users
WHERE users.id = created_by
然后您可以像处理聊天室数据一样使用 reader
变量获取包含用户数据的列。
我可以想到三个选项...
使用 ORM。我没有针对 MySQL 的具体建议,但某处可能存在某些东西。也许像 Dapper?但一般的想法是您使用一个在您的对象和查询之间进行内部映射的库。
如果您坚持使用简单的 ADO 样式查询,那么您可以简单地发出第二个查询,该查询使用您的 created_by
值来获取相关的 User
实例来自数据。
您可以通过在您的查询中包含 JOIN
将这些查询组合成一个查询。 (您可能想要包含一个 ORDER BY
以便记录以相同的用户顺序返回,因为这将使其余逻辑更简单。)然后在您的循环中您将编写一些更复杂的逻辑来构造您的对象.也许还有一个 User
对象的集合,您可以有条件地向其添加对象,然后最终结果中的每个 Chatroom
对象都可以根据其 created_by
值引用该集合中的一个对象。
为什么不使用 EF?
var chatroom = myDataContext.Chatrooms.Include(i => i.Created_by).ToList();
就是这样。
我有一个包含两个 table 的数据库——用户、聊天室。我的聊天室 table 看起来像这样:
created_by 列有一个外键将其连接到用户 table 主键 (id int(11))
用户table:
现在我想做这样的事情:
public class Chatroom
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public User Created_by { get; set; }
public Chatroom(int id, string name, string description, User created_by)
{
Id = id;
Name = name;
Description = description;
Created_by = created_by;
}
}
和 ApiController:
MySqlCommand command = new("SELECT id, name, description, created_by FROM chatrooms", connection);
MySqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
results.Add(new Chatroom(
(int)reader["Id"],
reader["Name"].ToString(),
reader["Description"].ToString(),
(User)reader["created_by"]
));
}
现在这显然是行不通的,因为created_by是Int32类型,而不是User,并且用户的id存储在那里,而不是用户自己。所以我的问题是,我将如何访问用户本身。谢谢。
您需要更改 select 语句以从用户 table:
获取创建聊天室的用户的数据SELECT id, name, description, created_by, users.Name, users.Surname, users.Email, users.Password FROM
chatrooms, users
WHERE users.id = created_by
然后您可以像处理聊天室数据一样使用 reader
变量获取包含用户数据的列。
我可以想到三个选项...
使用 ORM。我没有针对 MySQL 的具体建议,但某处可能存在某些东西。也许像 Dapper?但一般的想法是您使用一个在您的对象和查询之间进行内部映射的库。
如果您坚持使用简单的 ADO 样式查询,那么您可以简单地发出第二个查询,该查询使用您的
created_by
值来获取相关的User
实例来自数据。您可以通过在您的查询中包含
JOIN
将这些查询组合成一个查询。 (您可能想要包含一个ORDER BY
以便记录以相同的用户顺序返回,因为这将使其余逻辑更简单。)然后在您的循环中您将编写一些更复杂的逻辑来构造您的对象.也许还有一个User
对象的集合,您可以有条件地向其添加对象,然后最终结果中的每个Chatroom
对象都可以根据其created_by
值引用该集合中的一个对象。
为什么不使用 EF?
var chatroom = myDataContext.Chatrooms.Include(i => i.Created_by).ToList();
就是这样。