【问题标题】:Entity Framework nulling relationship instead of deleting实体框架清空关系而不是删除
【发布时间】:2021-10-14 02:05:42
【问题描述】:

我有一个代表公司的类,该公司有一个公司用户列表。我可以毫无问题地将用户添加到公司,甚至可以从公司中删除用户。但是,问题是当我删除用户时,他们的记录仍保留在数据库中,但使用 null 而不是外键。

这是公司类

public class Company : BaseModel
{
    public string Name { get; set; }
    public string UniqueId { get; set; }
    public virtual List<Location> CompanyLocations { get; set; }
    public virtual List<CompanyUser> CompanyUsers { get; set; }
}

以及公司用户

public class CompanyUser : BaseModel
{
    public string UserId { get; set; }
    public virtual Company Company { get; set; }
}

这是一个问题的例子。

如您所见,CompanyId 字段中有几行为空。我希望删除整行,而不仅仅是删除关系。

我想我可以在OnModelCreate 中添加一些东西来修复这种关系,但我不知道那是什么。

感谢任何帮助。

【问题讨论】:

  • 您正在寻找带有cascading delete 的外键。您的原始迁移应指定在删除时执行何种操作,并且现在很可能设置为无操作。您可以重新进行迁移,也可以使用OnModelCreate 中的 EFCore Fluent Api,如您所说:builder.Entity&lt;Company&gt;().WithMany(c =&gt; c.CompanyUsers).WithOne(cu =&gt; cu.Company).OnDelete(CascadeAction.Delete);
  • 感谢您的回复,我添加了类似的内容,现在可以使用 builder.Entity&lt;CompanyUser&gt;().HasOne(e =&gt; e.Company).WithMany(f =&gt; f.CompanyUsers).OnDelete(DeleteBehavior.Cascade); 。我想我还会添加您的建议,因为我还希望在删除公司时删除它。

标签: c# entity-framework entity-framework-core


【解决方案1】:

您应该从Users 数据库集中删除用户,而不是从公司用户关系中删除。例如,如果我们有一个名为 companyUserCompanyUser 变量来删除它,你应该这样做

this.context.Users.Remove(companyUser);
this.context.SaveChanges();

不是这样的

var company = this.context.Companies.Find(companyUser.Company.UniqueId)
company.CompanyUsers.Remove(companyUser);
this.context.SaveChanges();

在第二个示例中,您只是将CompanyUserCompany 之间的外键关系设置为空。但在第一个示例中,您要从数据库中删除整个 CompanyUser 记录。

【讨论】:

  • 这不是我想要的,对我问题的评论应该是答案。我不想删除用户,只想删除他们与公司的关系。问题是它在表中留下了空关系的一行。更新 OnDelete 解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多