Может ли контекст Entity Framework постоянно использоваться в коде? - PullRequest
0 голосов
/ 01 февраля 2012

В этом вопросе у меня возникла проблема с сохранением объектов, которые имели внешние ключи, потому что Objects были созданы из нескольких Objects, соединенных друг с другом через внешние ключи, но они каждый раз загружались с использованием различного контекста , Например:

  using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) {
        IQueryable<Konsultanci> listaKonsultantow = from k in context.Konsultancis
                                select k;

  }

Тогда где-то еще в коде будет больше context, используемых для получения большего количества типов объектов, таких как Персоны, Обучение, вы называете это.

Тогда будет код для его сохранения (упрощенно):

        using (var context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM)) {
            if (context.Szkolenies.Any(t => t.SzkolenieID == currentSzkolenie.SzkolenieID)) {
                context.Szkolenies.Attach(currentSzkolenie);
                context.ObjectStateManager.ChangeObjectState(currentSzkolenie, EntityState.Modified);
            } else {
                context.Szkolenies.AddObject(currentSzkolenie);
            }
            context.SaveChanges();


       }

Обычно после попытки его сохранения появляется несколько сообщений об ошибках

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

или

The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects

и несколько других.

Поэтому, чтобы решить эту проблему, я объявил private EntityBazaCRM context = new EntityBazaCRM(Settings.sqlDataConnectionDetailsCRM); в верхней части своего класса и постоянно использовал его, не помещая в using. Благодаря этому действию мне не пришлось ничего прикреплять до сохранения или чего-либо еще. Я просто использовал тот же контекст и прикрепил любые внешние ключи, которые хотел, используя currentUczestnik.Szkolenie = szkolenie; и currentUczestnik.Konsultanci = consultants ;. Сохранено без проблем.

На вопрос:

Это работает для небольшого графического интерфейса, который у меня есть, который не слишком сложен. Но что, если я ввожу многопоточность, попробуйте получить несколько значений из разных мест для разных объектов (загрузка объекта в GUI, ListView и т. Д.), Используя один и тот же контекст? Разве это не отразится на мне, причиняя мне серьезную боль?

В моем старом коде, прежде чем я узнал о Entity Framework, я использовал:

        const string preparedCommand = @"SELECT ID FROM TABLE WHERE NAME = "TEST"";
        using (SqlConnection varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
        using (var sqlQuery = new SqlCommand(preparedCommand, varConnection))
        using (SqlDataReader sqlQueryResult = sqlQuery.ExecuteReader())
            while (sqlQueryResult.Read()) {
                string id= sqlQueryResult["id"].ToString();
            }
        }

, который я использовал в основном каждый раз, когда хотел подключиться к SQL. Если бы не было соединения, оно было бы установлено, если бы было соединение, оно использовалось бы повторно и не было проблем с многопоточностью.

Может кто-нибудь сказать мне, какие проблемы я могу ожидать от того, как я это выяснил, работая? Или, может быть, это лучший способ сделать это?

1 Ответ

2 голосов
/ 01 февраля 2012

Но что, если я введу многопоточность, попробуйте получить несколько значений повсюду для разных объектов (загрузка объекта в графический интерфейс, ListView и т. Д.) Используя тот же контекст? Разве это не отразится на мне больно меня сильно?

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

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