实体框架删除没有依赖项的实体

本文关键字:实体 依赖 框架 删除 | 更新日期: 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);
        }
    }