将记录插入查找表

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 的行而不需要任何查询,这似乎是一个很大的开销。

我们是否可以不只是使用userIDfriendID 作为值来做一个基本的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();

【讨论】:

以上是关于将记录插入查找表的主要内容,如果未能解决你的问题,请参考以下文章

10.2 插入排序

如何使用 LRTIM 和 RTRIM 查找无效记录并将其插入错误表?

插入排序算法解析

插入排序学习笔记

插入排序算法

比较 2 个配置单元表以查找没有任何唯一列/时间戳的更新/插入/删除记录并将其附加到 Hadoop 中的基表