当我尝试删除我的实体时,我的功能会出现以下错误;
来自' ProjectWebsiteTag_ProjectUser'的关系AssociationSet是 在'已删除'州。 给定多重性约束,相应的“ProjectWebsiteTag_ProjectUser_Target”#39;还必须在“删除”中删除。状态。
这是我要删除的代码;
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"那就是它。
我在这里缺少什么?
答案 0 :(得分:1)
它没有尝试删除ProjectUser。它试图插入它。 ProjectWebsiteTagConfiguration()表示ProjectWebsiteTags表中有一个ProjectUser外键。当你打电话
ProjectWebsiteTag websiteTag = context.WebsiteTags.FirstOrDefault(p => p.WebsiteTagId == id)
websiteTag有一个ProjectUser,其UserId属性为空字符串。因此,ProjectWebsiteTags表中的记录对于外键具有空字符串,或者当您从上下文获取时,EF正在新建ProjectUser(具有空UserId)。无论哪种方式,EF都不知道存在具有空字符串id的ProjectUser,因此当您调用SaveChanges()时,它会尝试添加它。它不能,因为UserId字段是必需的并且是空的。
答案 1 :(得分:0)
我必须通过在User类中添加一对多关系配置来解决我的问题。 我需要在Configuration声明的两边添加关系提示。
public class ProjectUserConfiguration : EntityTypeConfiguration<ProjectUser>
{
public ProjectUserConfiguration()
{
ToTable("ProjectUsers");
HasKey(p => p.UserId);
HasMany(p=>p.ProjectWebsiteTags).WithRequired(q=>q.ProjectUser).WillCascadeOnDelete(false);
}
}