从集合中删除项目时的 EntityFramework 多重性错误

Posted

技术标签:

【中文标题】从集合中删除项目时的 EntityFramework 多重性错误【英文标题】:EntityFramework multiplicity error on removal of an item from a collection 【发布时间】:2013-12-12 14:22:49 【问题描述】:

我有一个具有此架构的父对象:

public class User : EntityBase

    private List<UserCompany> _UserCompanies = new List<UserCompany>();

    // The list of companies the user can act upon, with a flag indicating their Primary company
    public virtual List<UserCompany> UserCompanies
    
        get  return _UserCompanies;  
        set  _UserCompanies = value; 
    

还有一个看起来像这样的子对象:

public class UserCompany : EntityBase

    [Required]
    public virtual User User  get; set; 

    [Required]
    public virtual Company Company  get; set; 

    [Required]
    public virtual bool IsPrimary  get; set; 

两者都继承自 EntityBase 类:

  public abstract class EntityBase
  
    protected int _id;

    /// <summary>Database record ID.</summary>
    [DataMember(IsRequired = true)]
    [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int Id
    
      get  return _id; 
      set  _id = value; 
    
  

对象没有明确的模型配置,除了这个通用配置:

public EntityBaseConfiguration()

  HasKey(m => m.Id);
  Property(m => m.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

我遇到的问题是从 User.UserCompanies 集合中删除 UserCompany 会导致此错误:

*“UserCompany_User”关联集中的关系处于“已删除”状态。给定多重约束,相应的“UserCompany_User_Source”也必须处于“已删除”状态。*

我对这个错误的解释是它希望用户对象也被标记为已删除,这不是我的意图。谁能建议在这种情况下如何成功删除 UserCompany 对象(不删除用户或公司)?

【问题讨论】:

【参考方案1】:

这就是正在发生的事情。 UserCompany 不能在没有相关用户的情况下存在(因为 UserCompany.User 被标记为必需。当您从用户的 UserCompanies 集合中删除 UserCompany 时,实体框架将尝试仅执行此操作:删除关联,而不是 UserCompany。EF宁可谨慎行事,也不会假设您要删除该对象。它会尝试使外键无效 - 但它不能。

所以你必须明确删除 UserCompany 对象:

context.UserCompanies.Remove(userCompany);

context.Entry(userCompany).State = EntityState.Deleted;

【讨论】:

以上是关于从集合中删除项目时的 EntityFramework 多重性错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从集合视图中删除项目?

从集合中删除项目时出错[重复]

从集合视图中删除项目后的标签问题

从本地集合中删除项目而不删除

Java 集合(ListSet)遍历判断删除元素时的小陷阱

Java:在集合中添加/删除短元素和整数元素时的不同输出