实体框架删除没有依赖项的实体
本文关键字:实体 依赖 框架 删除 | 更新日期: 2023-09-27 18:01:05
当我试图删除我的实体时,我的函数中出现以下错误;
"ProjectWebsiteTag_ProjectUser"关联集中的关系为处于"已删除"状态。给定多重性约束,相应的"ProjectWebsiteTag_ProjectUser_Target"也必须处于"已删除"状态。
这是我要删除的代码;
public bool Delete(int id)
{
try
{
using (ProjectDataContext context = new ProjectDataContext())
{
ProjectWebsiteTag websiteTag = context.WebsiteTags.FirstOrDefault(p => p.WebsiteTagId == id);
context.WebsiteTags.Remove(websiteTag);
int saveChanges = context.SaveChanges();
return saveChanges > 0;
}
}
catch (DbEntityValidationException e)
{
FormattedDbEntityValidationException newException = new FormattedDbEntityValidationException(e);
throw newException;
}
}
这是我的数据类;
public class ProjectWebsiteTag
{
public int WebsiteTagId { get; set; }
public ProjectUser ProjectUser { get; set; }
public ProjectWebsite ProjectWebsite { get; set; }
}
我的配置类;
public ProjectWebsiteTagConfiguration()
{
ToTable("ProjectWebsiteTags");
HasKey(p => p.WebsiteTagId);
HasRequired(p => p.ProjectUser).WithRequiredDependent().WillCascadeOnDelete(false);
HasRequired(p => p.ProjectWebsite).WithRequiredDependent().WillCascadeOnDelete(false);
}
它看起来像是试图删除用户记录,但我不希望那样。我只想删除"ProjectWebsiteTag",就这样。
我在这里缺少什么?
它没有试图删除ProjectUser。它正在尝试插入它。ProjectWebsiteTagConfiguration((表示ProjectWebsiteTag表中有一个ProjectUser外键。当您调用时
ProjectWebsiteTag websiteTag = context.WebsiteTags.FirstOrDefault(p => p.WebsiteTagId == id)
websiteTag的ProjectUser的UserId属性为空字符串。因此,要么ProjectWebsiteTags表中的记录具有外键的空字符串,要么当您从上下文获取时,EF正在新建ProjectUser(具有空UserId(。不管怎样,EF都不知道存在一个字符串id为空的ProjectUser,所以当你调用SaveChanges((时,它会尝试添加它。它不能,因为UserId字段是必需的并且是空的。
我不得不通过在User类中添加一对多关系配置来解决问题。我需要在配置声明的两侧添加关系提示。
public class ProjectUserConfiguration : EntityTypeConfiguration<ProjectUser>
{
public ProjectUserConfiguration()
{
ToTable("ProjectUsers");
HasKey(p => p.UserId);
HasMany(p=>p.ProjectWebsiteTags).WithRequired(q=>q.ProjectUser).WillCascadeOnDelete(false);
}
}