Копия Entity (цель отката) перед сохранением?C#

Место общения программистов C#
Ответить
Anonymous
 Копия Entity (цель отката) перед сохранением?

Сообщение Anonymous »

Как новичок в моей работе, я получил ответственность за проект для коллеги, который покинул компанию. Это был его проект, так что это усложняет всю работу, потому что я совсем один для всего, а также я изучаю EF по мере продвижения. Проект-это приложение-клиент-сервер использует подход EF6, UOW и хранилища. На стороне сервера есть метод в репозитории < /p>
MyEntity SaveMyEntity(MyEntity myEntity)
{
//Do some validation before save - call stored procedure
//If fails throw exception

using(var context = new SomeContext())
{
//little bit of code for imagination how implementation looks like
context.my_entity_context_base.Attach(myEntity);
context.SyncObjectState(myEntity, myEntity.ObjectState);
context.SaveChanges();

//...

if (myEntity.EntityB != null && myEntity.EntityB.Count > 0)
{
foreach (var u in myEntity.EntityB.ToList())
{
context.entity_b_context_base.Attach(u);
context.SyncObjectState(u, u.ObjectState);
}

context.SaveChanges();
}

if (myEntity.EntityC != null && myEntity.EntityC.Count > 0)
{
foreach (var t in myEntity.EntityC.ToList())
{
context.entity_c_context_base.Attach(t);
context.SyncObjectState(t, t.ObjectState);
}

context.SaveChanges();
}

// and so on ..
}

//Validation after save - stored procedure is called
//If fails throws exception
//If validate_after_save fails there is rollback on DB side.

base.ExecuteStoredProcedure("validate_after_save", ref parameters, ref errorText);

if (!string.IsNullOrEmpty(errorText))
{
throw new OwnException("Save failed: " + errorText);
}

return this.GetMyEtity(myEntity.id);
}
< /code>
Когда не исключено, все в порядке, но когда проверка после сохранения, res, сторона клиента не получает фактическую сущность. Это действительно проблема в некоторых сценариях, как я узнал ранее. Например, я хочу сохранить сущность. Проверка после сохранения бросков EX (поэтому клиент не получает объект). Так что я что -то изменим и сохраню это снова. Поскольку предыдущая проверка после сохранения исключения, у клиента все еще есть состояние «добавлено», поэтому он бросает нарушение первичного ключа Ex. Полем Когда исключение бросается, они хотят оригинальные данные. Как вы можете видеть в коде выше, сейчас нет ничего подобного. Конечно, у меня есть транзакция, но как можно реализовать ее к текущей реализации, которую вы можете увидеть выше? < /P>
Моя идея - получить текущую сущность от DB. В случае исключения я называю SavemyEntity с данными, которые я получил перед сохранением. Но несколько проблем: < /p>

Я не уверен, где хранить ссылку на исходные данные (клиент
или сервер)? < /Li>
Я должен изменить состояние оригинальной сущности. Можно мне совет от вас? < /p>
Большое спасибо! >
Я только что обнаружил существование TransactionScope. Поэтому я попытался сделать что -то подобное < /p>
void SaveMyEntity(MyEntity myEntity)
{
//...

using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
{
using(var context = new SomeContext())
{
//...

if (myEntity.EntityB != null && myEntity.EntityB.Count > 0)
{
foreach (var u in myEntity.EntityB.ToList())
{
context.entity_b_context_base.Attach(u);
context.SyncObjectState(u, u.ObjectState);
}

context.SaveChanges();
}

if (myEntity.EntityC != null && myEntity.EntityC.Count > 0)
{
foreach (var t in myEntity.EntityC.ToList())
{
context.entity_c_context_base.Attach(t);
context.SyncObjectState(t, t.ObjectState);
}

context.SaveChanges();
}

// and so on ..
}

base.ExecuteStoredProcedure("validate_after_save", ref parameters, ref errorText);

if (!string.IsNullOrEmpty(errorText))
{
//Rollback
scope.Dispose();
throw new OwnException("Save failed: " + errorText);
}
else
{
//Commit
scope.Complete();
}
}
}
< /code>
И на самом деле это работает хорошо. Но я не уверен, правильное решение.

Подробнее здесь: https://stackoverflow.com/questions/385 ... efore-save
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»