实体框架删除没有依赖关系的实体

时间:2015-07-06 03:14:28

标签: c# entity-framework

当我尝试删除我的实体时,我的功能会出现以下错误;

  

来自' 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"那就是它。

我在这里缺少什么?

2 个答案:

答案 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);
        }
    }