使用实体框架

时间:2018-06-12 17:04:48

标签: c# asp.net-mvc linq entity-framework-6

我有一张表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}}表的所有行?

3 个答案:

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