【问题标题】:Inserting A Record To Lookup Table将记录插入查找表
【发布时间】:2018-07-19 21:12:53
【问题描述】:

我参考这里的答案(https://stackoverflow.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插入的实体框架

谢谢。

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    有几种方法可以做到这一点:

    首先,如果User_Friends 有自己的实体,您可以使用 id 填充新的 user_friends 并保存更改。

    第二个是创建一个新朋友和用户并附加他们(类似于这个,可能需要一些调整):

    var friend = new Friend{Id = friendID};
    
    var user = new User{Id = 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();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-05
            • 2021-08-25
            • 2016-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多