Entity Framework отменяет изменения - PullRequest
1 голос
/ 11 апреля 2011

Я разрабатываю веб-форму, в которой есть мастер с 4 шагами:

На каждом шаге я создаю новые сущности, сгенерированные из базы данных.

Проблема в том, что, будучи волшебником, пользователь может изменять свойства элементов управления, которые будут исходить из значений, которые будут сохранены.

Поэтому мне нужно освободить созданные объекты объектов или вернуть значения этих объектов в исходные строки, хранящиеся в базе данных.

Как я могу это сделать.

Должно ли это работать, если я устанавливаю для каждого созданного объекта сущности значение null?

Кстати, вот как я это делаю:

entities = new Entities();

...

Client client = new Client();
client.name = tbxName.text

...

entities.SaveChanges();
entities.Connection.Close();   

Итак, если этот код выполняется во 2-й части мастера из трех частей, и я снова и снова перебираю этот набор, как только созданный клиент запускается более одного раза, так что моя проблема.

Так как я могу создать его: -P

Thannks !!!

Ответы [ 3 ]

4 голосов
/ 11 апреля 2011

Если вы создаете мастер, вы должны управлять им как одной операцией.Это означает, что вы должны хранить построенный граф сущностей в сеансе и сохранять его только в том случае, если весь мастер завершен и подтвержден.Ваша пошаговая логика также должна проверять, присутствуют ли связанные данные в графе сущностей, и использовать их вместо создания новых.

0 голосов
/ 20 апреля 2011

Вот как я это делаю:

1- Создайте место, где вы можете управлять переменными сеанса:

public class SessionObjects { }

2- Я сохраняю свой ObjectContext в сеансе, поэтому ясоздайте свойство для управления им в указанном классе:

public static ObjectContextEntities ObjectContextEntities
{
    get
    {
        return (ObjectContextEntities)HttpContext.Current.Session["ObjectContextEntities"];
    }
    set
    {
        HttpContext.Current.Session["ObjectContextEntities"] = value;
    }

}

3- Инициализируйте ObjectContext в начале работы мастера и расположите его в конце:

void StartWizard()
{
    SessionObject.ObjectContextEntities = new ObjectContextEntities(); 
}

void StartWizard()
{
    SessionObject.ObjectContextEntities = new ObjectContextEntities(); 
}

void EndWizard()
{
    ((ObjectContextEntities)SessionObject.ObjectContextEntities).Dispose();
}

4- Чтобы сохранить мастеррезультат для базы данных вы можете вызвать:

void SaveWizard()
{
    ((ObjectContextEntities)SessionObject.ObjectContextEntities).SaveAllChanges();
}

5- Для сброса мастера просто вызовите EndWizard, а затем StartWizard.

Я думаю, вы знаете, как управлять объектами ObjectEntity и в ObjectContext, чтобы выможете продолжать отсюда самим собой.

0 голосов
/ 20 апреля 2011

Если вы используете Entity Framework, почему бы не реализовать шаблон Unit Of Work?Каждая часть вашего мастера создает UoW, а «последний шаг» фиксирует единицу работы.

В журнале MSDN была статья « Шаблон единицы работы и невосприимчивость к постоянству »Несколько лет назад это объясняет концепцию.

...