将记录插入查找表
Posted
技术标签:
【中文标题】将记录插入查找表【英文标题】:Inserting A Record To Lookup Table 【发布时间】:2018-07-19 21:12:53 【问题描述】:我参考这里的答案(https://***.com/a/20846170/1753877)关于如何在这种类型的关系中将记录插入到Users_Friends
查找表中
答案是:
var user = db.Users.Find(userID);
var friend = db.Friends.Find(friendID);
user.Friends.Add(friend);
db.SaveChanges();
但是,对我来说,必须从数据库中检索两个对象以插入仅包含应用程序已知的两个 ID 的行而不需要任何查询,这似乎是一个很大的开销。
我们是否可以不只是使用userID
和friendID
作为值来做一个基本的INSERT
(或者将它们传递给一个存储过程来做同样的事情)。
由于我是 Entity Framework 的新手,我不确定使用上面的代码是否有任何直接 SQL INSERT
会遗漏的优势,或者是否有正当理由避免使用直接 SQL插入的实体框架
谢谢。
【问题讨论】:
【参考方案1】:有几种方法可以做到这一点:
首先,如果User_Friends
有自己的实体,您可以使用 id 填充新的 user_friends 并保存更改。
第二个是创建一个新朋友和用户并附加他们(类似于这个,可能需要一些调整):
var friend = new FriendId = friendID;
var user = new UserId = userID;
using (var context = new Context())
context.Friends.Attach(friend);
user.Friends.Add(friend);
context.Entry(user).State = EntityState.Modified;
context.SaveChanges();
Entity Framework Add and Attach and Entity States
第三种是使用 Context.Database 并执行 sql 命令或 sql 查询(依赖)对数据库执行任意 SQL。
我发现最简单的方法是将User_Friends
作为它自己的 EF 实体并创建一个新实体。它使添加到联合表变得非常容易。
【讨论】:
【参考方案2】:你可以像这样直接插入:
db.Database.ExecuteSqlCommand(@"insert into Users_friends
(UserId, FriendId) values (0, 1)", userID, friendID);
我没有看到首先从 db 中检索值的优势(除了验证用户和朋友都存在)。但是,在上面的代码中,没有检查用户 ID、朋友 ID 对是否已经存在,这可以很容易地添加到 SQL 中。
【讨论】:
【参考方案3】:你是对的,这是很多不必要的开销。在 Entity Framework 中,只需传递一个加载了 PK 的类的新实例就足够了:
var user = db.Users.Find(userID);
var friend = new Friend Id = friendID ;
user.Friends.Add(friend);
db.SaveChanges();
【讨论】:
【参考方案4】:也将桥表创建为模型,像这样
public class User
public int Id get; set;
public string Username get; set;
public string PasswordHash get; set;
public string PasswordSalt get; set;
public List<UserFriend> Friends get; set;
public User()
Friends = new List<UserFriend>();
public class Friend
public int Id get; set;
public string FirstName get; set;
public string LastName get; set;
public class UserFriend
public int Id get; set;
public int UserId get; set;
public int FriendId get; set;
[ForeignKey("UserId")]
public User User get; set;
[ForeignKey("FriendId")]
public Friend Friend get; set;
然后你就可以像这样创建或获取用户好友了
// add user friend
var userFriend = new UserFriend()
UserId = userId,
FriendId = friendId
;
db.UserFriends.Add(userFriend);
db.SaveChanges();
// get user friends
db.Users.Include("Friends").ToList();
【讨论】:
以上是关于将记录插入查找表的主要内容,如果未能解决你的问题,请参考以下文章