Теперь, рассмотрев пример кода, который вы отредактировали для публикации, я определенно реорганизовал бы ваш класс, чтобы воспользоваться встроенной функциональностью LINQ-to-SQL. (Я не буду редактировать свой предыдущий комментарий, потому что это лучший ответ на общий вопрос)
Поля вашего класса выглядят довольно прямым отображением столбцов таблицы комментариев в базе данных. Поэтому вам не нужно делать большую часть того, что вы делаете вручную в этом классе. Большая часть функциональности может быть обработана, просто имея закрытый член типа Madtastic.Entities.Comment (и просто сопоставляя ваши свойства с его свойствами, если вам нужно поддерживать, как этот класс взаимодействует с остальной частью проекта). Тогда ваш конструктор может просто инициализировать закрытый член Madtastic.DataContext и установить свой закрытый член Madtastic.Entities.Comment на результат запроса LINQ. Если комментарий нулевой, создайте новый и вызовите InsertOnSubmit для DataContext. (но пока нет смысла отправлять изменения, потому что вы все равно не задали никаких значений для этого нового объекта).
В ваших SubmitChanges все, что вам нужно сделать, это вызвать SubmitChanges для DataContext. Он отслеживает, нужно ли обновлять данные, он не попадет в базу данных, если это не так, поэтому вам не нужен _isDirty.
В вашем Delete () все, что вам нужно сделать, это вызвать DeleteOnSubmit для DataContext.
В результате небольшого обзора вы можете обнаружить, что вам вообще не нужен класс Madtastic.Comment, а класс LINQ-to-SQL Madtastic.Entities.Comment может действовать непосредственно как уровень доступа к данным. Кажется, что единственными практическими отличиями являются конструктор, который принимает commentID, и тот факт, что Entities.Comment имеет свойство UsersID, где у вашего класса Madtastic.Comment есть целый пользователь. (Однако, если User также является таблицей в базе данных, а UsersID является внешним ключом своего первичного ключа, вы обнаружите, что LINQ-to-SQL создал объект User в объекте Entities.Comment, к которому вы можете обращаться напрямую с комментарием. Пользователь)
Если вы обнаружите, что можете полностью исключить этот класс, это может означать, что вы можете дополнительно оптимизировать жизненный цикл вашего DataContext, добавив его в методы вашего проекта, использующие Comment.
Отредактировано для публикации следующего примера измененного кода (извиняюсь за любые ошибки, поскольку я набрал его в блокноте за пару секунд вместо того, чтобы открывать Visual Studio, и я все равно не получил бы intellisense для вашего проекта):
namespace Madtastic
{
public class Comment
{
private Madtastic.DataContext mdc;
private Madtastic.Entities.Comment comment;
public Int32 ID
{
get
{
return comment.CommentsID;
}
}
public Madtastic.User Owner
{
get
{
return comment.User;
}
}
public Comment(Int32 commentID)
{
mdc = new Madtastic.DataContext();
comment = (from c in mdc.Comments
where c.CommentsID == commentID
select c).FirstOrDefault();
if (comment == null)
{
comment = new Madtastic.Entities.Comment();
mdc.Comments.InsertOnSubmit(comment);
}
}
public void SubmitChanges()
{
mdc.SubmitChanges();
}
public void Delete()
{
mdc.Comments.DeleteOnSubmit(comment);
SubmitChanges();
}
}
}
Возможно, вы также захотите внедрить IDisposable / использовать, как предложили несколько человек.