2015-07-06 3 views
0

Пока я пытаюсь удалить свою сущность, я получаю следующую ошибку в моей функции;Entity Framework Удалить Entity без его зависимости

Отношения с AssociationSet в '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; }   
    } 

My Config Class;

public ProjectWebsiteTagConfiguration() 
     { 
      ToTable("ProjectWebsiteTags"); 
      HasKey(p => p.WebsiteTagId); 
      HasRequired(p => p.ProjectUser).WithRequiredDependent().WillCascadeOnDelete(false); 
      HasRequired(p => p.ProjectWebsite).WithRequiredDependent().WillCascadeOnDelete(false); 
     } 

Похоже, что он пытается удалить запись пользователя, но я не хочу этого. Я просто хочу удалить «ProjectWebsiteTag» и все.

Что мне здесь не хватает?

+0

Это не кажется, случай каскадного удаления, он пытается добавить пользователя с нулевыми значениями в ненулевых полях – Rob

+0

@Rob Почему бы даже сделать это? Я даже не собираюсь вытягивать пользовательский объект из контекста. –

ответ

1

Он не пытается удалить ProjectUser. Он пытается вставить его. ProjectWebsiteTagConfiguration() говорит, что в таблице ProjectWebsiteTags есть внешний ключ ProjectUser. Когда вы позвоните по телефону

ProjectWebsiteTag websiteTag = context.WebsiteTags.FirstOrDefault(p => p.WebsiteTagId == id) 

websiteTag имеет ProjectUser с пустой строкой для своего свойства UserId. Таким образом, либо запись в таблице ProjectWebsiteTags имеет пустую строку для внешнего ключа, либо EF запускает ProjectUser (с пустым UserId), когда вы получаете из контекста. В любом случае EF не знает о существовании ProjectUser с пустым идентификатором строки, поэтому, когда вы вызываете SaveChanges(), он пытается его добавить. Это невозможно, потому что поле UserId является обязательным и пустым.

+0

Вы правы. Я инициализировал объект User внутри конструктора ProjectWebsiteTag. Я удалил эту инициализацию. Между тем, сейчас у меня другая ошибка. Я обновил вопрос. Спасибо за подсказку. –

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