c # Linq не может обновить запись

#c# #asp.net #sql #linq

#c# #asp.net #sql #linq

Вопрос:

Я пытаюсь обновить запись с помощью LINQ, но получаю эту ошибку:

 Property or indexer 'AnonymousType#1.Comment' cannot be assigned to -- it is read only
Property or indexer 'AnonymousType#1.LastEdit' cannot be assigned to -- it is read only
  

Это выдается в строках:

 // Update parent comment
q.Comment = EditedText;
q.LastEdit = DateTime.Now;
  

Полный класс приведен ниже:

 /// <summary>
/// Creates a new edit for a comment
/// </summary>
/// <param name="CommentID">ID of comment we are editing</param>
/// <param name="EditedText">New text for comment</param>
/// <param name="UserID">ID of user making the edit</param>
/// <returns>Status</returns>
public static CommentError NewEdit(int CommentID, string EditedText, int UserID)
{
    CommentError Status = CommentError.UnspecifiedError;

    using (DataClassesDataContext db = new DataClassesDataContext())
    {
        bool IsOriginalAuthor = false;
        var q = (from c in db.tblComments where c.ID == CommentID select new { c.UserID, c.PostDate, c.Comment, c.LastEdit }).Single();
        if (q == null)
            Status = CommentError.UnspecifiedError;
        else
        {
            if (q.UserID == UserID)
                IsOriginalAuthor = true;

            // Check if they are within lock time
            bool CanEdit = true;
            if (IsOriginalAuthor)
            {
                if (q.PostDate.AddMinutes(Settings.MinsUntilCommentLockedFromEdits) > DateTime.Now)
                {
                    Status = CommentError.CommentNowUneditable;
                    CanEdit = false;
                }
            }
            // Passed all checks, create edit.
            if (CanEdit)
            {
                // Update parent comment
                q.Comment = EditedText;
                q.LastEdit = DateTime.Now;

                // New edit record
                tblCommentEdit NewEdit = new tblCommentEdit();
                NewEdit.CommentID = CommentID;
                NewEdit.Date = DateTime.Now;
                NewEdit.EditedText = EditedText;
                NewEdit.UserID = UserID;
                db.tblCommentEdits.InsertOnSubmit(NewEdit);



                db.SubmitChanges();
                Status = CommentError.Success;
            }
        }
    }
    return Status;
}
  

Ответ №1:

Возникает ошибка, потому что вы выполняете select new { c.UserID, c.PostDate, c.Comment, c.LastEdit } . если вы сделаете select c , ваш код должен работать.

new {...} выдает анонимный тип, который не подлежит обновлению.

Ответ №2:

согласно сообщению об ошибке, q является анонимным типом…

  var q = (from c in db.tblComments where c.ID == CommentID select new { c.UserID, c.PostDate, c.Comment, c.LastEdit }).Single();
  

вы не хотите обновлять этот объект… обновите объект, на который ссылается c в инструкции LINQ (выберите его)