Миграции на 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 и в Projects?   -  person Gert Arnold    schedule 14.12.2012
comment
Герт, да, има проектен ред с UserID = 1.   -  person Jed Grant    schedule 14.12.2012
comment
Добре, това е наистина странно. Може би трябва да опитате да зададете потребителския обект, а не стойността на ключа.   -  person Gert Arnold    schedule 14.12.2012
comment
Не съм сигурен дали разбирам напълно. Опитах това, ако приемем, че имахте предвид: Замених UserID = 1 с User = new User { UserID = 1 }, но това просто създава нов ред в таблиците Users и 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)


Това изглежда е резултат от поредица от проблеми от необходимостта да се използва fluent api, за да му се каже да не каскадира при изтриване до настройката на виртуалните атрибути на потребителския клас да бъдат 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