我有一张表User { UserId, Name, Age }
和License { LicenseId, Name, IsActive }
。此外,我还有一个表UserLicense { UserId, LicenseId }
连接这两个表,并拥有持有许可证的所有用户的记录。用户可以拥有多个许可证,并且这些许可证在UserLicense
表中显示为不同的行。
现在我需要从许可证表中删除特定许可证。我不想完全删除它,所以我标记IsActive = false
。但是,我确实希望从UserLicense
表中删除该许可证ID的行。
我正在使用实体框架。
如果它是直接表,我会做类似的事情:
var lic = db.Licenses.Where(l => l.Id== licenseId).FirstorDefault();
db.Licenses.Remove(lic);
db.SaveChanges();
但是,由于UserLicense
是外键表,因此实体框架不允许我直接使用
public void DeleteLicensedUsers(Guid LicenseId)
{
db.UserLicenses.Where()
}
因为该模型不包含UserLicense的独立表,因为它只是一个外键表。
那么如何使用Linq和EF6删除特定UserLicense
的{{1}}表的所有行?
答案 0 :(得分:3)
如果您的实体类(我猜User
)具有类型为ICollection<Licence>
的导航属性,则通过从此集合中删除许可证,您实际上是从UserLicense
表中删除项目。这就是实体框架处理数据库中多对多关系的方式。
答案 1 :(得分:1)
我遇到了类似的问题,你可以这样解决。我几乎倾向于避免只使用外键的表,而是添加另一列来解决这个问题。
+---+--------+---------------+--------+
|id |name |email |category|
+---+--------+---------------+--------+
|'1'|'daniel'|'dan@gmail.com'|premium |
+---+--------+---------------+--------+
答案 2 :(得分:0)
我对你的问题感到有些困惑。因此,如果您将许可证标记为isActive = false
,并且仍希望看到该许可证显示在用户的页面上,那么UserLicense
表中仍应存在与这两者相关联的记录。
那就是说,我相信来自类似问题的this answer会对你有帮助。
基本上是这样的://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();