Вставка записи в таблицу поиска

Я имею в виду ответ здесь (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();

Однако мне кажется, что извлечение двух объектов из базы данных просто для того, чтобы вставить строку, состоящую только из двух идентификаторов, которые уже известны приложению, без каких-либо запросов.

Не могли бы мы просто сделать базовый INSERT, используя userID и friendID в качестве значений (или передать их хранимой процедуре, чтобы сделать то же самое).

Поскольку я новичок в Entity Framework, я не уверен, есть ли какие-либо преимущества в использовании приведенного выше кода, которые были бы упущены с прямым SQL INSERT, или если есть веская причина избегать использования прямого SQL с Entity framework для вставок

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
126
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете сделать прямую вставку, например:

db.Database.ExecuteSqlCommand(@"insert into Users_friends 
   (UserId, FriendId) values ({0}, {1})", userID, friendID);

Я не вижу преимущества при первом получении значений из базы данных (кроме проверки наличия и пользователя, и друга). Однако в приведенном выше коде нет проверки, существует ли уже пара userID, friendID, которую можно легко добавить в SQL.

Вы правы, что это много ненужных накладных расходов. В Entity Framework достаточно просто передать новый экземпляр класса с загруженным PK:

var user = db.Users.Find(userID);
var friend = new Friend { Id = friendID };
user.Friends.Add(friend);
db.SaveChanges();
Ответ принят как подходящий

Есть несколько способов сделать это:

Во-первых, если у User_Friends есть собственная сущность, вы можете просто заполнить новый 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 Добавить и присоединить и состояния сущностей

Третий - использовать Context.Database и либо выполнить команду sql, либо запрос sql (в зависимости от) для выполнения произвольного SQL для базы данных.

Что мне показалось самым простым, так это включить User_Friends в качестве собственного объекта EF и создать новый. Это упрощает добавление в объединенную таблицу.

Создайте также таблицу мостов как модель, например

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();

Другие вопросы по теме