Это мой код:
int j;
WebShopEntities data = new WebShopEntities();
var db = data;
var list =
(from line in System.IO.File.ReadLines(MyHttpApplication.GetAppDataPath() + "677254_dp_articles.TXT").AsParallel()
where line.EndsWith(";") && !((line.StartsWith("prom_erp_partno")))
let parts = line.Split('\t')
select new WebShop.dp_articles
{
prom_erp_partno = parts[0],
prom_mfm_partno = parts[1],
prol_name = parts[2],
mfm_short_name = parts[3],
prom_prfm_id=int.TryParse(parts[4],out j)?int.Parse(parts[4]):0,
prol_lng_id=int.Parse(parts[5]),
prol_variant=parts[6]??null,
vpl=parts[7]??null,
status=parts[8],
gross_weight=Decimal.Parse('0'+parts[9].Replace('.',',')),
commodity_code=parts[10],
returnable = parts[11].Replace(';', ' ').Trim()
}).ToList();
Parallel.ForEach(list, item =>
{
if (!(from x in db.dp_articles.AsParallel() where x.prom_erp_partno == item.prom_erp_partno select x).Any())
{
db.dp_articles.Add(new dp_articles
{
prom_erp_partno = item.prom_erp_partno,
prom_mfm_partno = item.prom_mfm_partno,
prol_name = item.prol_name,
mfm_short_name = item.mfm_short_name,
prom_prfm_id = item.prom_prfm_id,
prol_lng_id = item.prol_lng_id,
prol_variant = item.prol_variant,
vpl = item.vpl,
status = item.status,
gross_weight = item.gross_weight,
commodity_code = item.commodity_code,
returnable = item.returnable
});
}
else
{
var itemU = db.dp_articles.Find(item.prom_erp_partno);
itemU.prom_mfm_partno = item.prom_mfm_partno;
itemU.prol_name = item.prol_name;
itemU.mfm_short_name = item.mfm_short_name;
itemU.prom_prfm_id = item.prom_prfm_id;
itemU.prol_lng_id = item.prol_lng_id;
itemU.prol_variant = item.prol_variant;
itemU.vpl = item.vpl;
itemU.status = item.status;
itemU.gross_weight = item.gross_weight;
itemU.commodity_code = item.commodity_code;
itemU.returnable = item.returnable;
}
db.SaveChanges();
});
Мне нужно выполнять эти процессы параллельно, но у меня нет информации о параллельных процессах в С#. После быстрого поиска в Google я нашел этот синтаксис параллелизма, но после того, как я его запустил, появилась эта ошибка:
Контекст нельзя использовать во время создания модели. Это исключение может быть вызвано, если контекст используется внутри метода OnModelCreating или если к одному и тому же экземпляру контекста одновременно обращаются несколько потоков. Обратите внимание, что члены экземпляра DbContext и связанных классов не гарантируют потокобезопасность.
и трассировка стека:
Этот код анализирует текстовый файл и пытается поместить его в базу данных или обновить, если он существует.
Короче говоря, вы используете EF одновременно из многих потоков. Это не разрешено. Сканируйте весь свой код и убедитесь, что у вас нет ни одного места, где вы используете один и тот же EF ObjectContext (и т. д.) из нескольких потоков.