Миграции Entity Framework: инструкция INSERT конфликтует с ограничением FOREIGN KEY

У меня есть следующие модели

public class User
{
    public int UserID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string FacebookID { get; set; }
    public string GoogleID { get; set; }
    public string TwitterID { get; set; }
    public bool Admin { get; set; }
    public bool Authorized { get; set; }

    public virtual Comment Comment { get; set; }
    public virtual CommentReply CommentReply { get; set; }
    public virtual Project Project { get; set; }
    public virtual ProjectVote ProjectVote { get; set; }
    public virtual CommentReplyVote CommentReplyVote { get; set; }
    public virtual CommentVote CommentVote { get; set; }
    public virtual ProjectCoverVote ProjectCoverVote { get; set; }
}
public class Comment
{
    [Key]
    public int CommentID { get; set; }
    public int ProjectDocID { get; set; }
    public int UserID { get; set; }

    public string Text { get; set; }
    public string Annotation { get; set; }
    public string Quote { get; set; }
    public string Start { get; set; }
    public string End { get; set; }
    public string StartOffset { get; set; }
    public string EndOffset { get; set; }
    public DateTime DateCreated { get; set; }

    public virtual ICollection<CommentVote> CommentVote { get; set; }
    public virtual ICollection<CommentReply> CommentReply { get; set; }

    public virtual ProjectDoc ProjectDoc { get; set; }
    public virtual User User { get; set; } 
}

Затем я использовал это как часть начального метода в первых миграциях кода объекта:

 context.Users.AddOrUpdate(i => i.FirstName,
     new User { UserID = 1, FirstName = "Bob", LastName = "Dole", Email = "[email protected]", FacebookID = "123123124123", Admin = true, Authorized = true },
     new User { UserID = 2, FirstName = "Dale", LastName = "Dole", Email = "[email protected]", FacebookID = "123123124123", Admin = false, Authorized = true }
            );

context.Comments.AddOrUpdate(i => i.CommentID,
      new Comment { CommentID = 1, ProjectDocID = 1, UserID = 1, Text = "This is a comment", DateCreated = DateTime.Parse("Dec 03, 2011 12:00:00 PM") }
      );

Это ошибка, которую я получаю.

System.Data.SqlClient.SqlException: 
The INSERT statement conflicted with the FOREIGN KEY constraint 
"FK_dbo.Comment_dbo.User_CommentID". The conflict occurred in database 
"TEST_ba6946e96d174b7bac9543ba614c8cf8", table "dbo.User", column 'UserID'.

Если я закомментирую попытку добавить строку комментария, она отлично работает для моей таблицы Projects, в которой есть поле UserID. Помощь? Если вы обнаружите какие-либо несвязанные ошибки или вещи, о которых я должен знать, пожалуйста, не стесняйтесь указывать на них.


person Jed Grant    schedule 13.12.2012    source источник
comment
Может ли быть так, что User имеет столбец идентификаторов UserId, поэтому значения в скрипте игнорируются? (А пользователь с Id=1 удален)   -  person Gert Arnold    schedule 14.12.2012
comment
Вы также вставляете UserID = 1 в Project?   -  person Gert Arnold    schedule 14.12.2012
comment
Герт, да, есть строка проекта с UserID = 1.   -  person Jed Grant    schedule 14.12.2012
comment
Хорошо, это действительно странно. Возможно, вам следует попытаться установить объект User, а не значение ключа.   -  person Gert Arnold    schedule 14.12.2012
comment
Не уверен, что я полностью понимаю. Я попробовал это, предполагая, что это то, что вы имели в виду: заменил UserID = 1 на User = new User {UserID = 1}, но это просто создает новую строку в таблицах пользователей и 0 в строке комментариев.   -  person Jed Grant    schedule 14.12.2012
comment
Нет, я имею в виду: сделать переменную первого пользователя (var u = new User { UserID = 1, ... и в комментарии: User = u.   -  person Gert Arnold    schedule 14.12.2012


Ответы (1)


Похоже, это было результатом ряда проблем: от необходимости использовать свободный API, чтобы сообщить ему, что он не должен каскадироваться при удалении, до установки виртуальных атрибутов в классе User как ICollection‹>. Я также использовал такие вещи, как

 public virtual ProjectDoc ProjectDoc { get; set; }

Вместо

 public ProjectDoc ProjectDoc { get; set; }

Не уверен, в чем именно разница, но теперь это работает.

person Jed Grant    schedule 14.12.2012
comment
Вы, по крайней мере, потеряли функцию ленивой загрузки, если не все отношения, удалив virtual - person Malcolm O'Hare; 14.12.2012