Entity Framework создает новую запись в таблице, на которую я не ссылался при вставке в другую таблицу - PullRequest
2 голосов
/ 03 апреля 2012

На этом сайте пользователи могут зарегистрироваться под именем пользователя и паролем, а также могут оставлять комментарии к статьям.Модели довольно просты:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public bool IsAdmin { get; set; }
    public DateTime JoinDate { get; set; }
    public string AvatarPath { get; set; }
    public string EmailAddress { get; set; }
}

public class ArticleComment
{
    public int Id { get; set; }
    public int ArticleId { get; set; }
    public int UserId { get; set; }
    public string CommenterName { get; set; }
    public string Message { get; set; }
    public DateTime CommentDate { get; set; }
    public User User { get; set; }
}

Entity Framework правильно установил отношение внешнего ключа между UserId в ArticleComment и Id on User, когда база данных была создана с использованием кода вначале.

Вот мой кодкогда пользователь публикует новый комментарий:

public JsonResult SubmitComment(int articleId, string comment)
    {
        var response = new JsonResponse();
        var currentUser = _userRepository.GetUserByUsername(User.Identity.Name);

        //...

        var newComment = new ArticleComment
        {
            ArticleId = articleId,
            CommentDate = DateTime.Now,
            CommenterName = currentUser.Username,
            UserId = currentUser.Id,
            User = currentUser,
            Message = comment,
        };

        try
        {
            _articleRepository.Insert(newComment);
        }
        catch (Exception e)
        {
            response.Success = false;
            response.AddError("newComment", "Sorry, we could not add your comment. Server error: " + e.Message);
            return Json(response);
        }

        response.Success = true;
        response.Value = newComment;
        return Json(response);
    }

Все значения, из которых состоит объект newComment, кажутся правильными, а метод Insert в моем классе репозитория Article является прямым и точным:

    public void Insert(ArticleComment input)
    {
        DataContext.ArticleComments.Add(input);
        DataContext.SaveChanges();
    }

Но как только это произойдет, poof: новая запись в моей таблице Users появится вместе с новой записью в ArticleComments.Вся информация в новой записи пользователя дублируется из существующей записи этого пользователя - единственное отличие - это значение для первичного ключа Id.Что дает?

1 Ответ

3 голосов
/ 03 апреля 2012

В дополнение к моему комментарию вам необходимо убедиться, что и _userRepository, и _articleRepository используют один и тот же экземпляр DbContext.

Либо так, либо вы можете попробовать это:

var newComment = new ArticleComment
{
    ArticleId = articleId,
    CommentDate = DateTime.Now,
    CommenterName = currentUser.Username,
    UserId = currentUser.Id,
    // User = currentUser, let the UserId figure out the User, don't set it yourself.
    Message = comment,
};
...