PDA

View Full Version : update یک فیلد توسط کلید اصلی



Wily_Fox
شنبه 26 مرداد 1392, 23:24 عصر
باسلام و خسته نباشید

قبلا جهت update یه فیلد یا چند فیلد جدول با داشتن کلید اصلی ما به شکل زیر عمل می کردیم:

update tblStudent set FName='Ali' , LName='Mohammadi' where Sid=110;

حالا من میخوام با Ef همین کار رو انجام بدم.

چطور باید بنویسم؟

البته بدون جستجو یعنی کد زیر رو نمیخوام

var item=db.tblStudent.Find(110);

item.FName="Ali";
item.LName="Mohammadi";

db.Entry(item).State = System.Data.EntityState.Modified;
db.SaveChange();


متشکرم

ali_autumnal
سه شنبه 05 شهریور 1392, 18:42 عصر
بله امکانش هست. بایستی از Attach استفاده کنید. به شکل زیر:



var item = new UserProfile
{
UserId = 2,
FirstName = "Ali",
LastName = "Mohammadi"
};
context.UserProfiles.Attach(item);
var e = context.Entry(item);
e.Property(p => p.FirstName).IsModified = true;
e.Property(p => p.LastName).IsModified = true;
context.SaveChanges();



اما فقط یک شرط داره اینکه بایستی فیلد هایی که در مدل با خاصیت Required مزین کردید و همچنین فیلد هاییکه از نوع DateTime هستند حتما مقداردهی کنید حتی اگر نخواهید اینها تغییر کنند باید مقدار داشته باشند.

یعنی در مثال بالا اگر مدل UserProfile شما فیلد Sex و UserName رو با خاصیت Required مزین کردید و همچنین تاریخ تولد رو از نوع DateTime تعریف کردید بایستی به شکل زیر بنویسید تا update صورت بگیره. (همونطور که مشخص است من مقادیر این فیلد ها رو شانسی پر کردم. یعنی فقط کافیه مقدار داشته باشند)



var item = new UserProfile
{
UserId = 2,
FirstName = "Ali",
LastName = "Mohammadi",
Sex=true,
BirthDate=DateTime.Now,
UserName="jhbhsfsfg"
};
context.UserProfiles.Attach(item);
var e = context.Entry(item);
e.Property(p => p.FirstName).IsModified = true;
e.Property(p => p.LastName).IsModified = true;
context.SaveChanges();


این مدل Update دیگه نیازی به جستجوی آیتم مورد نظر نداره و Ef بصورت خودکار بقیه کارهارو انجام میده.

Wily_Fox
سه شنبه 05 شهریور 1392, 18:53 عصر
دستت درد نکنه. دقیقا همون چیزی بود که میخواستم

مهرداد صفا
سه شنبه 12 شهریور 1392, 23:01 عصر
با سلام.
تاپیک زیر را مطالعه کنید:

به روز رسانی داده ها با استفاده از EF (http://barnamenevis.org/archive/index.php/t-417168.html)

Wily_Fox
شنبه 16 شهریور 1392, 09:54 صبح
با سلام.
تاپیک زیر را مطالعه کنید:

به روز رسانی داده ها با استفاده از EF (http://barnamenevis.org/archive/index.php/t-417168.html)

در این تایپیک شما فرمودید:

ولی اگر شما جایی با این مدل به مشکل برخوردید می توانید مستقیما از دستورات TSQL برای کنترل و دسترسی به داده ها استفاده کنید.

با توجه به کدی هم که نوشتید نیاز به Connection هست! اما من با Unit Of Work توسط Structuremap و سرویس ها کار می کنم. نمی خوام Connection اضافه ای انجام بدم.

راه حل شما واسه این کار چیه؟

f.beigirad
دوشنبه 18 شهریور 1392, 20:22 عصر
در این تایپیک شما فرمودید:


با توجه به کدی هم که نوشتید نیاز به Connection هست! اما من با Unit Of Work توسط Structuremap و سرویس ها کار می کنم. نمی خوام Connection اضافه ای انجام بدم.

راه حل شما واسه این کار چیه؟
یکم دقیقتر تاپیک پیشنهادی رو بررسی کنید .
ایشون ابتدا آپدیت با دستورات TSQL رو گفتن و بعد همون دستورات رو به دستورات EF تبدیل کردن.
از Connection هم برای TSQL استفاده کردن .نه EF.

قابل فهم ترین کد آپدیت برای من ، کد زیر هست :
شاید بدردتون بخوره.

using (var db = new DBEntities())
{
var person = db.Persons.Where(m=>m.PersonID ==??????).First();
person.FirstName = "F";
person.LastName = "Beigirad";
db.SaveChanges();
}

Wily_Fox
سه شنبه 19 شهریور 1392, 13:59 عصر
یکم دقیقتر تاپیک پیشنهادی رو بررسی کنید .
ایشون ابتدا آپدیت با دستورات TSQL رو گفتن و بعد همون دستورات رو به دستورات EF تبدیل کردن.
از Connection هم برای TSQL استفاده کردن .نه EF.

قابل فهم ترین کد آپدیت برای من ، کد زیر هست :
شاید بدردتون بخوره.

using (var db = new DBEntities())
{
var person = db.Persons.Where(m=>m.PersonID ==??????).First();
person.FirstName = "F";
person.LastName = "Beigirad";
db.SaveChanges();
}



دوست عزیز بالا گفتم من بهیچ عنوان نمیخوام جستجو کنم تا (طبق مثال شما Persons کد شماره x رو پیدا کنم) من کلید اصلی رو دارم و میخوام فقط یک فیلد از Persons رو Update کنم!!!




dataBase.words.Where(word => word.extra == "NONE").ToList().ForEach(word => word.extra = "--");
dataBase.AcceptAllChanges();


در مثال دوست عزیزمون مهرداد صفا هم جستجو انجام شده!!!!!!!!!

بنظرم شما تایپیک رو کامل مطالعه نکرده اید!!!!!!!!!

f.beigirad
سه شنبه 19 شهریور 1392, 16:18 عصر
[QUOTE=ali_autumnal;1860900]بله امکانش هست. بایستی از Attach استفاده کنید. به شکل زیر:


var item = new UserProfile
{
UserId = 2,
FirstName = "Ali",
LastName = "Mohammadi",
Sex=true,
BirthDate=DateTime.Now,
UserName="jhbhsfsfg"
};
context.UserProfiles.Attach(item);
var e = context.Entry(item);
e.Property(p => p.FirstName).IsModified = true;
e.Property(p => p.LastName).IsModified = true;
context.SaveChanges();


میشه توضیح کوتاهی درباره 3 خط کد 11,12,13 بفرمایید.

ali_autumnal
سه شنبه 19 شهریور 1392, 18:33 عصر
Update a record without first querying? (http://stackoverflow.com/questions/4218566/update-a-record-without-first-querying)
و
Attaching and Detaching Objects (http://msdn.microsoft.com/en-us/library/bb896271.aspx)

زمانی که دستور
context.Entry(item).State = System.Data.EntityState.Modified;
اجرا می کنیم در واقع به ef میگیم که Update کن با کلیه فیلدها
اما زمانی که شما به شکل زیر می نویسید:


context.UserProfiles.Attach(item);<u>
var e = context.Entry(item);
e.Property(p => p.FirstName).IsModified = true;
e.Property(p => p.LastName).IsModified = true;
context.SaveChanges();

به ef میگیم Update کن فقط فیلدهایی که IsModified = true دارند.

حتی می توان در یک رکورد فیلدهایی که قرار است update شوند زیاد است می توان به شکل زیر از دستور بالا بهره برد:



context.Entry(item).State = System.Data.EntityState.Modified;

var e=context.Entry(item);
e.Property(p => p.FirstName).IsModified = false;
e.Property(p => p.LastName).IsModified = false;


در این حالت ابتدا IsModified کلیه فیلدهای item رو true می کنیم سپس فیلدهایی که قرار نیست Update شوند رو IsModified آنها رو false می کنیم.

و در آخر (http://msdn.microsoft.com/en-us/data/jj592676.aspx)

f.beigirad
سه شنبه 19 شهریور 1392, 22:42 عصر
با سلام.
میشه بفرمایید چرا متد Entry در لیست پیشنهادی وجود نداره؟

using (var contex = new DBEntities2())
{
var e=contex.
}

بعد از context ، متد Entry تو لیست پیشنهادی نیست.

من دو using پایین رو هم اضافه کردم ولی entry اضافه نشد.

using System.Data.EntityClient;
using System.Data.Entity;