PDA

View Full Version : درج و اپدیت چندین رکورد با entity framework



negar.rafie
سه شنبه 16 شهریور 1395, 01:26 صبح
سلام
من از entity framework و linq استفاده میکنم
یک جدول دارم برای کارمندان

نام جدول:person

که شامل فیلدهای:(کد پرسنلی و پاداش هستش)
code
padash

حالا میخوام به صورت گروهی چندین کد پرسنلی را ثبت کنم به همراه پاداش و یا در صورت موجود بودن پاداش را ویرایش کنم

مثلا ببینید در سیستم من همه کارمندان پاداش دریافت نمیکنند و فقط برخی از انها پاداش دریافت میکنند
حالا در اینجا عمل اپدیت و درج رکورد فکر کنم باید موازی با هم باشند و با هم انجام بگیرند

یعنی فرضا من میخوام به پاداش کارمندان اضافه کنم و همینطور در همین مرحله امکان داره یکی از کارمندان به این جدول اضافه بشه برای دریافت پاداش

مثال زیر را ببینید:
code padash
100 1
100 2

در اینجا کد 1 و 2 پاداش دریافت میکنند و میخوام مثلا پاداش را بکنم 200 و در همین مرحله وقتی روی دکمه ذخیره کلیک کردم یک کارمند دیگه هم اضاضه بشه
که جدول من باید بشه این:
code padash
200 1
200 2
200 3

جستجو کردم و BulkInsert پیشنهاد شده ولی خب چون عمل درج و ویرایش با هم هستند نمیدونم چکار کنم

mr.sirwan
سه شنبه 16 شهریور 1395, 01:45 صبح
سلام، از متد AddOrUpdate استفاده کردین؟ نتیجه؟

negar.rafie
سه شنبه 16 شهریور 1395, 11:09 صبح
در یک مقاله خوندم که نباید از این متد استفاده کنیم
من دنبال ی روش اصولی هستم

alexmcse
سه شنبه 16 شهریور 1395, 11:25 صبح
سلام

//با //linq

List<person> pp = new List<person >();
person p1=new person
{
name = "sara" ,
code = "1"
};
person p2 = new person
{
name = "reza" ,
code = "2"
};
person p3 = new person
{
name = "ali",
code="3"
};

pp.AddRange(new List<person>( ) {p1 ,p2,p3});
//به جای
//DataContext1
//باید نام دیتا کانتکس خودتان را بنویسید


DataContext1 con = new DataContext1();
con.persons.InsertAllOnSubmit(pp);
con.SubmitChanges();

negar.rafie
سه شنبه 16 شهریور 1395, 12:20 عصر
اخه معلوم نیست چندتا کارمند قراره درج بشه یا فیلد پاداش اونها ویرایش بشه
این روش به نظر نمیره روش اصولی باشه

ژیار رحیمی
سه شنبه 16 شهریور 1395, 13:57 عصر
List<Person> persons = new List<Student>();


//افزودن سطر جدید
private void btnInsertRow_Click(object sender, EventArgs e)
{
persons.Add(new Person{ code=1,padash=20000}) ;
}
//حذف سطر
private void btnDeleteRow_Click(object sender, EventArgs e)
{
var prs=persons.Find(1);
persons.Remove(prs);

}
//ذخیره لیست
private void btnSave_Click(object sender, EventArgs e)
{
using (var context = new SchoolDBEntities())
{
context.Persons.AddRange(persons);
context.SaveChanges();
}
}

negar.rafie
سه شنبه 16 شهریور 1395, 19:44 عصر
دوستان مشکل من اضافه کردم و حذف نیست
اینها را بلد هستم
مثل اینکه کامل و درست پست من را مطالعه نمیکنید

alexmcse
سه شنبه 16 شهریور 1395, 20:47 عصر
دوستان مشکل من اضافه کردم و حذف نیست
اینها را بلد هستم
مثل اینکه کامل و درست پست من را مطالعه نمیکنید

سلام

چطور میخواهید اطلاعات کارمندان را وارد برنامه کنید ؟

daniyaltjm
سه شنبه 16 شهریور 1395, 20:55 عصر
چون مقدار پاداش برای همه یکسان تغییر میکنه فکر کنم باید بعد از ویرایش یک دستور Select بزارید که تمام مقادیر فیلد پاداش رو چک کنه مثلا اگه 200 نبود (چون 200 رو موقع ویرایش وارد کردین و ممکنه در همین لحظه یک کارمند اضافه شده باشه) تغییرش بده به 200

ژیار رحیمی
سه شنبه 16 شهریور 1395, 21:09 عصر
میشه روش شما رو پیاده کرده مثالی که در پست قبلی گذاشتم مشکل شما رو حل میکنه.شما کم توجهی کردین.شما بعد نمونه سازی باید پاداش های قبلی(رکوردهای جدول person) رو در لیست لود کنی و در btnInsertRow_Click بصورت زیر اصلاح کنی


private void btnInsertRow_Click(object sender, EventArgs e)
{
//چک کردن که آیا رکورد قبلا درج شده
var rec=persons.FirstOrDefault(c=>c.Id>0 && c.Code==1);
if(rec==null) //قبلا در لیست درج نشده
{persons.Add(new Person{ code=1,padash=20000}) ;return;}
//ویرایش رکورد جاری
rec.padash=20000;
}

negar.rafie
سه شنبه 16 شهریور 1395, 21:41 عصر
میشه روش شما رو پیاده کرده مثالی که در پست قبلی گذاشتم مشکل شما رو حل میکنه.شما کم توجهی کردین.شما بعد نمونه سازی باید پاداش های قبلی(رکوردهای جدول person) رو در لیست لود کنی و در btnInsertRow_Click بصورت زیر اصلاح کنی


private void btnInsertRow_Click(object sender, EventArgs e)
{
//چک کردن که آیا رکورد قبلا درج شده
var rec=persons.FirstOrDefault(c=>c.Id>0 && c.Code==1);
if(rec==null) //قبلا در لیست درج نشده
{persons.Add(new Person{ code=1,padash=20000}) ;return;}
//ویرایش رکورد جاری
rec.padash=20000;
}


ممنون
ولی این برای وقتی که یک رکورد باشه اره
ولی معلوم نیست رکوردهای من چندتا هستند
از طرفی امکان داره بخوام در همون لحظه یک کارمند را حذف کنم از جدول پاداش بگیرها
من میخوام با کلیک روی یک دکمه همه به صورت یکجا اتفاق بیافته
چون کارمندان من در گرید لود میشن و یک چک باکس دارم برای اینکه ایا پاداش بگیره یا نه
حالا مثلا اگر یک کارمند قبلا پاداش میگرفته الان با برداشتن تیک چک باکس باید از جدول حذف بشه
یا اگر قبلا نبود و تیکش را زدیم باید اضافه بشه

ali_md110
چهارشنبه 17 شهریور 1395, 07:15 صبح
سلام، از متد AddOrUpdate استفاده کردین؟ نتیجه؟
همون AddOrUpdate با یک حلقه و چند تا شرط توی حلقه مشکل شما حل میشه
بعدش میشه بگید چرا AddOrUpdate اصولی نیست؟

negar.rafie
چهارشنبه 17 شهریور 1395, 08:15 صبح
داخل این سایت خوندم استفاده نکنیم

http://www.dotnettips.info/post/1344/%DA%86%D9%86%D8%AF-%D9%86%DA%A9%D8%AA%D9%87-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%AF%D8%B1%D8%A8%D8%A7%D8%B1%D9%87-entity-framework

بعدش میشه بگید چطوری بنویسم

negar.rafie
چهارشنبه 17 شهریور 1395, 17:37 عصر
دوستان اصلا فکر کنم اون سوالم یکم پیچیده هستش
اونا بذارید کنار
فرض کنید داخل جدول اینها هستند
code padash
200 1
200 2
200 3

حالا میخوایم مثلا پاداش ایدی 1 بشه 300
ایدی 2 بشه 500
ایدی 3 بشه 700

چه کدی باید بنویسیم که بشه به صورت همزمان چندین رکورد را بروزرسانی کرد

Mahmoud.Afrad
چهارشنبه 17 شهریور 1395, 18:10 عصر
یک شئ از context بسازید و تغییرات اعم از درج و حذف و آپدیت را روی اون انجام بدید. یک دکمه برای ثبت تغییرات که در اون متد SaveChanges فراخوانی میشه و یک دکمه کنسل هم میتونید اضافه کنید که با توجه به مثالی که قبلا براتون با بایندینگ سورس زده بودم کار سختی نیست.

negar.rafie
چهارشنبه 17 شهریور 1395, 20:00 عصر
یعنی با ی حلقه for بیام و کل سطرها را با استفاده از پراپرتی Local بررسی کنم و اگر سطری باید حذف بشه یا ویرایش یا اضافه روی اون اعمال کنم و فقط یکبار متد savechange را صدا بزنم؟

ali_md110
چهارشنبه 17 شهریور 1395, 21:07 عصر
داخل این سایت خوندم استفاده نکنیم

http://www.dotnettips.info/post/1344/%DA%86%D9%86%D8%AF-%D9%86%DA%A9%D8%AA%D9%87-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%AF%D8%B1%D8%A8%D8%A7%D8%B1%D9%87-entity-framework

بعدش میشه بگید چطوری بنویسم

توی سایت جناب نصیری گفته شده متدAddOrUpdate هنگام Migration استفاده نکنیم نه همه جای برنامه
در هر صورت این متد خیلی کارگشا هست و میتونید توی یک حلقه با AddOrUpdateرکوردهای جدید را درج و رکوردهای ویرایش شده را به روزرسانی کنیم


var dc = new ApplicationDbContext();

var persons = personViewModels.Select(x => new Personnel
{
Id = x.Id,
Padash=x.Padash

});
dc.Persons.AddRange(details);
///////////////////////////////////////
foreach (var detail in persons)
{
var find = dc.Persons.Find(detail.Id);
find.Padash = detail.Padash;
dc.Persons.Attach(find);
dc.Entry(detail).State = EntityState.Modified;
}


اکر personViewModels به یک دیتاگراید Bind شده باشه یا تک تک رکوردها درونش ریخته شده باشه با متدAddrange میتونید یهویی رکودهاتون درج کنید و اگر خواستید فقط ویرایش کنید توی حلقه دیگه مثل حلقه پایین تری به روزرسانی کنید
البته میتونید مستقیم روی personViewModels یک حلقه بزنید و ویرایش رو انجام بدید و متد find درون حلقه رو فراموش نکنید

negar.rafie
پنج شنبه 18 شهریور 1395, 12:01 عصر
ممنون ولی نه
اخه شاید قراره باشه یه رکورد حذف بشه اونوقت این متد کارگشا نیست

Mahmoud.Afrad
پنج شنبه 18 شهریور 1395, 15:51 عصر
اگر از بایندینگ سورس استفاده می کنید میتونید از متدهای AddNew و RemoveCurrent و ... برای درج و حذف استفاده کنید.
مثال:
مدل public class Person
{
[Key]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[NotMapped]
public string FullName
{
get { return FirstName + " " + LastName; }
}

[Required]
public decimal Amount { get; set; }
}

class DatabaseContext :DbContext
{
public DbSet<Person> Persons { get; set; }
}
یک فرم شامل دیتاگرید، دکمه های افزودن، حذف سطرجاری، لغو تغییرات و ذخیره تغییرات، چهار تکست باکس شامل تکست باکس id(که readonly هست) نام و نام خانوادگی و مقدارپاداش.
کد فرم
public partial class Main : Form
{
private DatabaseContext _context;
private BindingSource _bindingSource;

public Main()
{
InitializeComponent();

_context = new DatabaseContext();

_context.Persons.Load();

_bindingSource = new BindingSource
{
DataSource = _context.Persons.Local.ToBindingList()
};
dataGridView1.DataSource = _bindingSource;
DataGridViewColumn firstnameColumn = dataGridView1.Columns["FirstName"];
if (firstnameColumn != null) firstnameColumn.Visible = false;
DataGridViewColumn lastnameColumn = dataGridView1.Columns["LastName"];
if (lastnameColumn != null) lastnameColumn.Visible = false;

txtId.DataBindings.Add("Text", _bindingSource, "Id");
txtFirstName.DataBindings.Add("Text", _bindingSource, "FirstName");
txtLastName.DataBindings.Add("Text", _bindingSource, "LastName");
txtBonus.DataBindings.Add("Text", _bindingSource, "Amount");
}

private void btnAddNew_Click(object sender, EventArgs e)
{
_bindingSource.AddNew();
}

private void btnRemove_Click(object sender, EventArgs e)
{
_bindingSource.RemoveCurrent();
}

private void btnCancel_Click(object sender, EventArgs e)
{
foreach (var entry in _context.ChangeTracker.Entries<Person>())
{
entry.State = entry.State == EntityState.Added ? EntityState.Detached : EntityState.Unchanged;
}

_bindingSource.ResetBindings(false);
}

private void btnSave_Click(object sender, EventArgs e)
{
_context.SaveChanges();
}
}

mrprestige
پنج شنبه 18 شهریور 1395, 18:47 عصر
اگر از بایندینگ سورس استفاده می کنید میتونید از متدهای AddNew و RemoveCurrent و ... برای درج و حذف استفاده کنید.
مثال:
مدل public class Person
{
[Key]
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[NotMapped]
public string FullName
{
get { return FirstName + " " + LastName; }
}

[Required]
public decimal Amount { get; set; }
}

class DatabaseContext :DbContext
{
public DbSet<Person> Persons { get; set; }
}
یک فرم شامل دیتاگرید، دکمه های افزودن، حذف سطرجاری، لغو تغییرات و ذخیره تغییرات، چهار تکست باکس شامل تکست باکس id(که readonly هست) نام و نام خانوادگی و مقدارپاداش.
کد فرم
public partial class Main : Form
{
private DatabaseContext _context;
private BindingSource _bindingSource;

public Main()
{
InitializeComponent();

_context = new DatabaseContext();

_context.Persons.Load();

_bindingSource = new BindingSource
{
DataSource = _context.Persons.Local.ToBindingList()
};
dataGridView1.DataSource = _bindingSource;
DataGridViewColumn firstnameColumn = dataGridView1.Columns["FirstName"];
if (firstnameColumn != null) firstnameColumn.Visible = false;
DataGridViewColumn lastnameColumn = dataGridView1.Columns["LastName"];
if (lastnameColumn != null) lastnameColumn.Visible = false;

txtId.DataBindings.Add("Text", _bindingSource, "Id");
txtFirstName.DataBindings.Add("Text", _bindingSource, "FirstName");
txtLastName.DataBindings.Add("Text", _bindingSource, "LastName");
txtBonus.DataBindings.Add("Text", _bindingSource, "Amount");
}

private void btnAddNew_Click(object sender, EventArgs e)
{
_bindingSource.AddNew();
}

private void btnRemove_Click(object sender, EventArgs e)
{
_bindingSource.RemoveCurrent();
}

private void btnCancel_Click(object sender, EventArgs e)
{
foreach (var entry in _context.ChangeTracker.Entries<Person>())
{
entry.State = entry.State == EntityState.Added ? EntityState.Detached : EntityState.Unchanged;
}

_bindingSource.ResetBindings(false);
}

private void btnSave_Click(object sender, EventArgs e)
{
_context.SaveChanges();
}
}
عرض ادب و احترام خدمت جناب افراد ، جناب افراد برام سوالی پیش اومده در این زمینه که بنده با Code First کار میکنم ولی روش ثبت اطلاعاتم و اصلا در کل تغییرات روی اطلاعاتم با کدی که الان شما لطف کردید نوشتید فرق میکنه میخواستم بدونم این کد شما همون روش DataBinding هست که شما توی EF بکار بردینش یا اینکه این کد شامل Code First نمیشه ( منظورم اینه که این کد برای Model First یا Database First هست) . پیشاپیش از پاسخگوییتون سپاسگذارم .

Mahmoud.Afrad
پنج شنبه 18 شهریور 1395, 19:24 عصر
عرض ادب و احترام خدمت جناب افراد ، جناب افراد برام سوالی پیش اومده در این زمینه که بنده با Code First کار میکنم ولی روش ثبت اطلاعاتم و اصلا در کل تغییرات روی اطلاعاتم با کدی که الان شما لطف کردید نوشتید فرق میکنه میخواستم بدونم این کد شما همون روش DataBinding هست که شما توی EF بکار بردینش یا اینکه این کد شامل Code First نمیشه ( منظورم اینه که این کد برای Model First یا Database First هست) . پیشاپیش از پاسخگوییتون سپاسگذارم .

code first هست دیگه. کلاس مدل رو نگاه کنید. البته فرقی نمیکنه code first , model first , database first باشه.
به هر صورت حتی با datatable و dataset هم میتونید با BindingSource کار کنید.
بله به روش DataBinding هست(تکست باکس ها با دیتابایدینگ متصل شدند)


و یا اینکه کلا روند رو خودتون به دست بگیرید(از بایندینگ سورس استفاده نکنید) که البته کد بیشتری نیاز هست.

mrprestige
پنج شنبه 18 شهریور 1395, 20:12 عصر
code first هست دیگه. کلاس مدل رو نگاه کنید. البته فرقی نمیکنه code first , model first , database first باشه.
به هر صورت حتی با datatable و dataset هم میتونید با BindingSource کار کنید.
بله به روش DataBinding هست(تکست باکس ها با دیتابایدینگ متصل شدند)


و یا اینکه کلا روند رو خودتون به دست بگیرید(از بایندینگ سورس استفاده نکنید) که البته کد بیشتری نیاز هست.

برای زمانی که با Seed اطلاعات جدول رو پر میکنیم چطور ؟ بازم میشه از DataBinding استفاده کنیم به عنوان مثال من برای ثیت اطلاعاتم ( زمانی که فقط برای بار اول ثبت بشه ) از seed به این صورت استفاده میکنم

protected override void Seed(DataB context)
{
base.Seed(context);
Country C = null;
C=new Country(1,"CANADA");
C.State =new List<State>();
C.State.Add(new State(1,"Vankover"));
C.State.Add(new State(2, "Otava"));
C.State.Add(new State(3, "Montreal"));
context.Countries.Add(C);
context.SaveChanges();
}


الان کلا عرض بنده اینه بیاییم از اول همه رو با کدنویسی ( همون فرمایش خودتون که "
اینکه کلا روند رو خودتون به دست بگیرید(از بایندینگ سورس استفاده نکنید)
" ) انجام بدم بهتره یا اینکه این روشی که شما بکار بردید چون این کدی که شما هم نوشتید برام جالب بود ولی از طرفی هم خودمم خوشم میاد که از اول تا آخر برنامم رو با کد بنویسم ( چون اینطوری روی کدهام مسلط ترم و هم برنامم انعطاف بهتری داره ) و نمیخوام از کنترلی یا آبجکتی یا ... کمتر استفاده کنم . به نظر شما راه اصولی کدومه ؟

Mahmoud.Afrad
پنج شنبه 18 شهریور 1395, 21:53 عصر
BindingSource (و یا BindinList) رو برای این انتخاب کردم که با تغییر در دیتاسورس، تغییرات در دیتاگرید هم به نمایش در بیاد و با انتخاب یک سطر از دیتاگرید اطلاعات اون سطر به تکست باکسها منتقل بشه. در صورتی که از بایندینگ سورس استفاده نکنید باید انتقال اطلاعات بین دیتاسورس و دیتاگرید و کنترلها رو کونویسی کنید. از اونجایی که بایندینگ سورس یک کلاس درونی از فریمورک هست بدون مشکل میتونید استفاده کنید و البته از کنترل شما بر پروژه کم نخواهد کرد.

ali_md110
جمعه 19 شهریور 1395, 12:53 عصر
ممنون ولی نه
اخه شاید قراره باشه یه رکورد حذف بشه اونوقت این متد کارگشا نیست
دوست عزیز اگر سوالتون بهتر مطرح کنید زودتر ب نتیجه میرید
شما ننوشتید ک عمل حذف هم میخاید انجام بدید فقط نوشتید update
بعدش این عملیات یکباره توسط گراید انجام میدید یا کنترلهای دیگه
Binding هست یا خیر؟
mvvm و ویومدل هست یا codebehind
ضمنا ef سیستم قوی و پیشرفته داره فقثط کافیه رکوردها رو علامت گذاری کنید
با دستوراتی شبیه اینها



State = EntityState.Modified
State == EntityState.Added
State = EntityState.Deleted

بریزید توی حافظه و Savechange بزنید

negar.rafie
جمعه 19 شهریور 1395, 13:33 عصر
ممنون
اگر سوالم نا مفهوم بود معذرت میخوام
توسط گرید انجام میدم
یعنی لیست کارمندان داخلش میریزم بعد بر اساس اون لیست میام و میگم مثلا کارمندی که در سطر فلان است پاداشش اضافه بشه(ویرایش) یا حذف بشه اگر قبلا پاداش میگرفته یا تازه به جدول پاداش بگیرها اضافه بشه

حالا طبق فرمایشات جناب محمود اومدم از باندیگ سورس کمک گرفتم و یک حلقه گذاشتم تا سطرها گرید پیمایش کنه و در داخل حلقه با متد firstordefault میام بررسی میکنم که اگر نیست اضافه بشه و . ...
و در نهایت متد savechanges

حالا روش شما چگونه است؟
بعد میشه بگید mvvm و ویومدل هست یا codebehind چی هستن راستش متوجه نشدم چی هستن و من دارم از کدوم روش استفاده میکنم

ژیار رحیمی
جمعه 19 شهریور 1395, 15:53 عصر
دوست گرامی بجای توضیح چندباره مشکل شما در این تاپیک بهنره بخشی از پروژه رو که دارای مشکل پیاده سازی هست در قالب یه پروژه اینجا بزاری تا بررسی شود.

veniz2008
جمعه 19 شهریور 1395, 16:11 عصر
دوستان اصلا فکر کنم اون سوالم یکم پیچیده هستش
اونا بذارید کنار
فرض کنید داخل جدول اینها هستند
code padash
200 1
200 2
200 3

حالا میخوایم مثلا پاداش ایدی 1 بشه 300
ایدی 2 بشه 500
ایدی 3 بشه 700

چه کدی باید بنویسیم که بشه به صورت همزمان چندین رکورد را بروزرسانی کرد


سلام.
اولین نکته ای که وجود داره اینه که شما قطعا براساس یک شرط، اقدام به انتخاب گروهی از کارمندان می کنید و تصمیم به تغییر پاداش (Update) یا حذف کارمتدان دارای پاداش (Delete) می کنید.
اگر برداشت من از جملاتتون درست باشه، می تونید به روش زیر عمل کنید :
جهت استفاده گروهی برای عملیات های Update و Delete بصورت پیش فرض متدی وجود نداره ولی می تونید برای انجام گروهی این کارها از طریق nuget اقدام به نصب Extension های زیر کنید که با وجود حجم خیلی کم ،خروجی فوق العاده ای رو به همراه داره.
ابتدا دستور زیر را وارد و اجرا کنید (اتصال به اینترنت فراموش نشه)

Install-Package EntityFramework.Extended
بعد از نصب، فضای نام زیر رو به بالای فرم مورد نظر اضافه کنید :

using EntityFramework.Extensions;
حالا می تونید از متدهای Update و Delete بصورت گروهی برای کارهای مورد نظرتون استفاده کنید. من نحوه استفاده رو با ذکر یک مثال توضیح میدم :
فرض کنید یک کلاس Car بصورت زیر داریم (کلاس Context رو هم خودتون اضافه کنید).

public class Car
{
public int Id { get; set; }
public string CarName { get; set; }
public string Color { get; set; }
public int ProduceYear { get; set; }
}
حالا جهت استفاده داریم :

private void btnOperation_Click(object sender, EventArgs e)
{
DatabaseContext db = new DatabaseContext();
//
db.Cars.Where(x => x.Id >= 5).Update(x => new Car { Color = "Red" });
MessageBox.Show("تا اینجا، رکوردهای مورد نظر داخل دیتابیس آپدیت شدن");

db.Cars.Where(c => c.Id >= 80 && c.Id <= 107).Delete();
MessageBox.Show("در این مرحله، اطلاعات مورد نظر از دیتابیس حذف شدن");
}
نیازی به استفاده از متد SaveChanges برای ذخیره اطلاعات نداریم. تمامی این کارها بصورت اتومات انجام میشن.
از نظر سرعت هم، برای بیش از 1000 رکورد که من تست کردم کمتر از 1 ثانیه (هر 2 عملیات با هم) زمان گرفت.
موفق باشید.

negar.rafie
جمعه 19 شهریور 1395, 16:37 عصر
دوست گرامی بجای توضیح چندباره مشکل شما در این تاپیک بهنره بخشی از پروژه رو که دارای مشکل پیاده سازی هست در قالب یه پروژه اینجا بزاری تا بررسی شود.

مشکل را باکمک جناب محمود حل کردم
حالا طبق فرمایشات جناب محمود اومدم از باندیگ سورس کمک گرفتم و یک حلقه گذاشتم تا سطرها گرید پیمایش کنه و در داخل حلقه با متد firstordefault میام بررسی میکنم که اگر نیست اضافه بشه و . ...
و در نهایت متد savechanges
دوستمون ali_md110 گفتند ی روش دیگه هست گفتم توضیح بدن همین


ممنون جناب veniz2008 (http://barnamenevis.org/member.php?155296-veniz2008)
این روش را میدونستم ولی ی مشکلی که داره ثابت هستش
یعنی در این روش یک فیلد فقط یک مقدار میگیره و برای سرچ اشخاص یک شرط ثابت
مثلا کسانی که id اونها بزرگتر از 6 بود فیلد پاداش بشه 300
ونمیشه مثلا id را از یک جایی مثل لیست خوند و همینطور برای هر شخص یک مقدار ثبت بشه

veniz2008
جمعه 19 شهریور 1395, 17:22 عصر
این روش را میدونستم ولی ی مشکلی که داره ثابت هستش
یعنی در این روش یک فیلد فقط یک مقدار میگیره و برای سرچ اشخاص یک شرط ثابت
مثلا کسانی که id اونها بزرگتر از 6 بود فیلد پاداش بشه 300
ونمیشه مثلا id را از یک جایی مثل لیست خوند و همینطور برای هر شخص یک مقدار ثبت بشه
ثابت نیست.
شما می تونی از یه لیست بخونی و اگر وجود داشت بعد عمل مورد نظرت رو انجام بدی .
در مثال زیر اگر ID داخل دیتابیس با اعداد داخل لیست برابر باشه، عمل آپدیت انجام میشه.

List<int> lst = new List<int>();
for (int i = 995; i < 1000; i++)
{
lst.Add(i);
}

DatabaseContext db = new DatabaseContext();
//
db.Cars.Where(x => lst.Contains(x.Id)).Update(x => new Car { Color = "Orange"});
موفق باشید.

negar.rafie
جمعه 19 شهریور 1395, 18:20 عصر
حالا اون مقدار color چی؟
میشه اونم متغییر باشه برای هر id

veniz2008
یک شنبه 21 شهریور 1395, 21:30 عصر
فکر نمی کنم بشه با همون متد Update برای هر id یک رنگ (یک مقدار) متفاوت ست کرد. ولی می تونید با یه حلقه foreach این کار رو انجام بدید.
فرض کنید یک کالکشن دو مقداری مثل یک Dictionary<int, string دارید که مقدار اول معادل فیلد Id باشه و مقدار دوم هم مقدار برای اون Id باشه :
در کد زیر برای id های 0 تا 9 درون جدول Car، مقدار معادل در Dictionry درج میشه.

Dictionary<int, string> dic = new Dictionary<int, string>();
for (int i = 0; i < 10; i++)
{
dic.Add(i, "Color" + i.ToString());
}
//
DatabaseContext db = new DatabaseContext();
db.Cars.Where(x => dic.Keys.ToList().Contains(x.Id)).ToList().ForEach (c => c.Color = dic[c.Id] );