从集合中删除项目时的 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 多重性错误的主要内容,如果未能解决你的问题,请参考以下文章