Как новичок в моей работе, я получил ответственность за проект для коллеги, который покинул компанию. Это был его проект, так что это усложняет всю работу, потому что я совсем один для всего, а также я изучаю 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
Копия Entity (цель отката) перед сохранением? ⇐ C#
Место общения программистов C#
-
Anonymous
1739399449
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>
И на самом деле это работает хорошо. Но я не уверен, правильное решение.
Подробнее здесь: [url]https://stackoverflow.com/questions/38564673/copy-of-entity-rollback-purpose-before-save[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия