Я имею в виду ответ здесь (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 для вставок
Спасибо.





Вы можете сделать прямую вставку, например:
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();