Я новичок в структуре сущностей, и я действительно запутался в том, как работает сохранение.В моем примере, вероятно, много кода, который можно улучшить, но вот проблема, с которой я столкнулся.
Пользователь вводит кучу пиков.Я уверен, что пользователь еще не ввел эти выборы.Затем я добавляю выборки в базу данных.
var db = new myModel()
var predictionArray = ticker.Substring(1).Split(','); // Get rid of the initial comma.
var user = Membership.GetUser();
var userId = Convert.ToInt32(user.ProviderUserKey);
// Get the member with all his predictions for today.
var memberQuery = (from member in db.Members
where member.user_id == userId
select new
{
member,
predictions = from p in member.Predictions
where p.start_date == null
select p
}).First();
// Load all the company ids.
foreach (var prediction in memberQuery.predictions)
{
prediction.CompanyReference.Load();
}
var picks = from prediction in predictionArray
let data = prediction.Split(':')
let companyTicker = data[0]
where !(from i in memberQuery.predictions
select i.Company.ticker).Contains(companyTicker)
select new Prediction
{
Member = memberQuery.member,
Company = db.Companies.Where(c => c.ticker == companyTicker).First(),
is_up = data[1] == "up", // This turns up and down into true and false.
};
// Save the records to the database.
// HERE'S THE PART I DON'T UNDERSTAND.
// This saves the records, even though I don't have db.AddToPredictions(pick)
foreach (var pick in picks)
{
db.SaveChanges();
}
// This does not save records when the db.SaveChanges outside of a loop of picks.
db.SaveChanges();
foreach (var pick in picks)
{
}
// This saves records, but it will insert all the picks exactly once no matter how many picks you have.
//The fact you're skipping a pick makes no difference in what gets inserted.
var counter = 1;
foreach (var pick in picks)
{
if (counter == 2)
{
db.SaveChanges();
}
counter++;
}
Я тестировал, и SaveChanges даже не должен быть в цикле.Приведенный ниже код тоже работает.
foreach (var pick in picks)
{
break;
}
db.SaveChanges()
Очевидно, что-то происходит с контекстом, который я не понимаю.Я полагаю, что я каким-то образом загрузил свои новые медиаторы как ожидающие изменения, но даже если это правда, я не понимаю, что мне нужно их циклически повторять, чтобы сохранить изменения.
Может кто-нибудь объяснить это мне?
Вот обновленный рабочий код, основанный на ответах Крейга: 1) Удалите Тип, затем зациклите результаты и заполните новые объекты.
var picks = (from prediction in predictionArray
let data = prediction.Split(':')
let companyTicker = data[0]
where !(from i in memberQuery.predictions
select i.Company.ticker).Contains(companyTicker)
select new //NO TYPE HERE
{
Member = memberQuery.member,
Company = db.Companies.Where(c => c.ticker == companyTicker).First(),
is_up = data[1] == "up", // This turns up and down into true and false.
}).ToList();
foreach (var prediction in picks)
{
if (includePrediction)
{
var p = new Prediction{
Member = prediction.Member,
Company = prediction.Company,
is_up = prediction.is_up
};
db.AddToPredictions(p);
}
}
2) Или, если я не хочу, чтобы предсказаниябыть спасенным, я могу отделить предсказания.
foreach (var prediction in picks) {
if (excludePrediction)
{
db.Detach(prediction)
}
}