2013-05-14 2 views
1

Получение следующее сообщение об ошибке при сохранения моего контекста:«Отношения не могут быть изменены, так как один или несколько внешних ключей свойств не является обнуляемым ...»

Операция не удалась: отношения не могут быть изменены, поскольку одно или несколько свойств внешнего ключа не имеют значения NULL. Когда происходит изменение отношения, соответствующее свойство внешнего ключа устанавливается равным нулевому значению. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, для свойства внешнего ключа должно быть назначено другое ненулевое значение, или не связанный с ним объект должен быть удален.

код контроллера:

#region CreateStory 
[HttpPost] 
[Authorize] 
public ActionResult CreateStory(Userstory story) 
{ 
    if (ModelState.IsValid) 
    { 
     string _Username = User.Identity.Name.ToLower(); 

     using (var _Db = new NimbleContext()) 
     { 
      Project _Project = _Db.Projects.First(p => p.Owner.ToLower() == _Username); 

      if (_Project != null) 
      { 
       ProjectGroup _Group = _Db.Groups.First(g => g.GroupID == story.GroupID); 

       if (_Group != null) 
       {        
        _Db.Userstories.Add(story); 
        _Db.SaveChanges(); <--- Error Occurs here! 
        return Json(new { Success = true, GroupID = _Group.GroupID }); 
       } 
      }            
     } 
    } 
    return Json(new { Success = false }); 
} 
#endregion 

Структура Модель:

Проект 1 -> * Группы 1 -> * Userstories

я могу предотвратить ошибку из возникающих путем удаления следующих объявлений:

Project _Project = _Db.Projects.First(p => p.Owner.ToLower() == _Username); 
ProjectGroup _Group = _Db.Groups.First(g => g.GroupID == story.GroupID); 

Однако мне нужно сделать эти проверки, чтобы гарантировать, что пользователь принадлежит проекту и т. Д. Я действительно не вижу, что вызывает ошибку, ни одно из этих утверждений не должно влиять на данные, которые должны быть сохранены правильно?

+0

я создаю некоторые тесты , и я не думаю, что хочу реализовать обходное решение, предложенное ответом. Что вы в итоге сделали? –

ответ

1

Все это в вашем дизайне модели. Если вы явно объявить внешний ключ свойства, сделать их как это:

public class Project { 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ProjectId { get; set; } 

    public virtual ICollection<Group> Groups { get; set; } 
} 

public class Group { 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int GroupId { get; set; } 

    [ForeignKey("Project"), DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int? ProjectId { get; set; } 

    public virtual Project Project { get; set; } 
    public virtual ICollection<Userstory> Userstories{ get; set; } 
} 

public class Userstory { 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UserstoryId{ get; set; } 

    [ForeignKey("Group"), DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int? GroupId { get; set; } 

    public virtual Group Group { get; set; } 
} 

Примечание: Это должно работать, если вы следуете Entity Framework Code First, не уверен, о других методик, таких как Model First и Database First

+0

Спасибо, это решило проблему. Но создал новую проблему для меня! Теперь у меня проблемы с ленивой загрузкой и доступом к коллекциям моделей в представлении из-за отсутствия соединения с БД. – Jack

+0

@Jack Если я не вижу, какая ошибка и какой код ее вызывает, мне нечего начинать. Кроме того, я предлагаю вам спросить об этом в отдельном вопросе и, возможно, разместите ссылку здесь, чтобы я мог добраться до нее. – Komengem

Смежные вопросы

 Смежные вопросы