.NET Entity Framework Savechanges هو إضافة دون إضافة طريقة
-
19-09-2019 - |
سؤال
أنا جديد على إطار الكيان وأنا مرتبك حقا حول كيفية عمل Savechanges. ربما يكون هناك الكثير من التعليمات البرمجية في مثالتي التي يمكن تحسينها، لكن هذه المشكلة التي أواجهها.
يدخل المستخدم حفنة من اللقطات. أتأكد من أن المستخدم لم يدخل بالفعل تلك اللقطات. ثم أضفت اللقطات إلى قاعدة البيانات.
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()
من الواضح أن هناك شيئا ما يحدث مع السياق الذي لا أفهمه. أعتقد أنني قمت بتحميل اختياراتي الجديدة بطريقة ما هي التغييرات المعلقة، ولكن حتى لو كان هذا صحيحا، فلا أفهم أنه لا بد لي من الحلقة عنها لحفظ التغييرات.
يمكن للشخص أن يفسر هذا لي؟
فيما يلي رمز العمل المحدث بناء على ردود Craig's: 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)
}
}
المحلول
السبب هو هنا:
select new Prediction
{
Member = memberQuery.member,
هذه الخطوط سوف (مرة واحدة IEnumerable
يتم تكرارها لينك كسول):
- إرسال جديد
Prediction
- ربط ذلك
Prediction
مع موجودةMember
, ، * وهو مرتبطdb
.
ربط مثيل كيان مع كيان مرفق تلقائيا يضيف هذا الكيان إلى سياق الكيان المرفق المرتبط.
بمجرد أن تبدأ التكرار predictionArray
, ، ينفذ التعليمات البرمجية أعلاه ولديك كيان جديد في سياقك.