Entity Framework - что делать, если SaveChanges не работает и я не хочу вносить какие-либо изменения? - PullRequest
4 голосов
/ 26 января 2011

Я думаю, что столкнулся с общей проблемой: я хотел бы попытаться вставить объект в базу данных.Если первичный ключ нарушен, я хотел бы прервать вставку.(это пример, вопрос действительно относится к любой ошибке и любой из операций CRUD)

Как я могу отменить изменения, внесенные в контекст EF?

Я не могу позволить себе воссоздавать его каждый раз, когда что-то идет не так.

PS.Я знаю, что, возможно, я мог бы проверить, все ли в порядке, например.запрашивая БД, но мне не нравится идея.По некоторым причинам существуют ограничения по БД, и таким образом это быстрее, и мне приходится писать меньше кода.

Ответы [ 2 ]

1 голос
/ 27 января 2011

Вы можете отсоединить вставленный объект от ObjectContext. Вы также можете использовать ObjectStateManager и его метод GetObjectStateEntries. В ObjectStateEntry вы можете изменить его состояние.

Проблема в том, что вы не используете технологию предполагаемым образом:

Я не могу позволить себе воссоздавать его каждый время что-то идет не так.

Конечно, вы должны, потому что ваш код не предотвращает такие ситуации.

PS. Я знаю, что, возможно, я мог бы проверить если все в порядке, например. путем запроса БД, но мне не нравится идея. децибел ограничения по какой-то причине и таким образом это быстрее, и я должен пишите меньше кода.

Да, действительно, вы должны проверить, все ли в порядке. Вызов базы данных для «проверки» ваших данных - это то, что администраторам баз данных действительно нравится (сарказм) Вы несете ответственность за достижение максимально возможной достоверности ваших данных, прежде чем позвонить по номеру SaveChanges. Я могу себе представить, что многие старшие разработчики / руководители команд просто не пропустят ваш код в ходе проверки кода. И кстати. в большинстве случаев это не быстрее из-за межпроцессного или сетевого взаимодействия.

0 голосов
/ 26 января 2011

Попробуйте использовать DbTransaction.

System.Data.Common.DbTransaction _tran = null;


 _tran = _ent.Connection.BeginTransaction();

_tran .Commit (); //after SaveChanges();

и, если есть исключение, сделайте откат.

_tran.Rollback();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...