Чтобы удалить строку из таблицы только внешних ключей, используя Entity Framework - PullRequest
0 голосов
/ 12 июня 2018

У меня есть таблица User { UserId, Name, Age } и License { LicenseId, Name, IsActive }.Также у меня есть таблица UserLicense { UserId, LicenseId }, которая соединяет оба из них и имеет запись для всех пользователей, имеющих лицензию.Пользователь может иметь несколько лицензий, и они отображаются в виде разных строк в таблице UserLicense.

Теперь мне нужно удалить конкретную лицензию из таблицы лицензий.Я не хочу удалять это сразу, поэтому я отмечаю IsActive = false.Однако я хочу удалить строки из таблицы UserLicense для этого идентификатора лицензии.

Я использую Entity Framework.

Если это прямая таблица, я бы сделал что-то вроде:

var lic = db.Licenses.Where(l => l.Id== licenseId).FirstorDefault();
db.Licenses.Remove(lic);
db.SaveChanges();

Однако, поскольку UserLicense является таблицей внешних ключей, Entity Framework не позволяет мне обращаться к ней напрямую, используя

public void DeleteLicensedUsers(Guid LicenseId)
{
    db.UserLicenses.Where()
}

, поскольку модель не содержит независимую таблицудля UserLicense, так как это всего лишь таблица внешних ключей.

Итак, как мне удалить все строки таблицы UserLicense для определенного licenseId, используя Linq и EF6?

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Я немного смущен вашим вопросом.Таким образом, если вы помечаете лицензию как isActive = false и по-прежнему хотите, чтобы эта лицензия отображалась на странице пользователя, тогда в таблице UserLicense должна быть запись, связывающая эти две лицензии.

Тем не менее, я считаю, этот ответ на аналогичный вопрос поможет вам.

по существу:

//include licenses in the user entity
var result = ctx.User.Include(x=>x.Licenses).Where(t=>t.Id == _id).FirstOrDefault()
//get the licenses you are looking for, either equal or use .Contains
var licensesOfUser = result.Where(x=>x.Licenses.Where(l=>l.id == _licenseId);
//remove them from entity and save.
result.Licenses.RemoveRange(licenseOfUser);
ctx.SaveChanges();

[редактировать: если у вас есть лицензия]

//include users in license entities  
var result = ctx.License.Include(x=>x.Users).Where(t=>t.Id == _id).FirstOrDefault()
//get the users you are looking for, either equal or use .Contains
var usersOfLicenses = result.Where(x=>x.Users.Where(l=>l.id == _userId);
//remove them from entity and save.
result.Users.RemoveRange(licenseOfUser);
ctx.SaveChanges();
0 голосов
/ 13 июня 2018

Я столкнулся с подобной проблемой, и вы можете решить ее таким образом.Я почти избегаю таблиц только с внешними ключами и вместо этого добавляю еще один столбец для решения этой проблемы.

var license = db.Licenses.Where(l => l.ID == LicenseId).FirstOrDefault();
var users = license.Users.ToList();


if (users != null)
{
    foreach (var user in users)
    {
         license.Users.Remove(user);
    }                   
}
0 голосов
/ 12 июня 2018

Если у вашего класса сущностей (я думаю User) есть навигационные свойства типа ICollection<Licence>, удалив License из этой коллекции, вы фактически удаляете элементы из таблицы UserLicense.Вот как Entity Framework обрабатывает отношения «многие ко многим» в базах данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...