#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 (выберите его)