PDA

View Full Version : سوال: تعریف شی Entities به صورت استاتیک



python_85
پنج شنبه 25 اسفند 1390, 23:36 عصر
سلام
یه سوال داشتم
توی یه برنامه واسه ارتباط با دیتابیس از EF استفاده می خوام بکنم.
توی کلاس DataAccess بهتر شی Entities رو به صورت استاتیک تعریف بکنم یا نه هر بار که از کلاس DataAccess یه آبجکت ایجاد می کنم شی Entities هم ساخته بشه و با از بین رفتن شی DataAccess ،شی Entities هم از بین بره؟

hf1988
شنبه 27 اسفند 1390, 09:13 صبح
سلام
یه سوال داشتم
توی یه برنامه واسه ارتباط با دیتابیس از EF استفاده می خوام بکنم.
توی کلاس DataAccess بهتر شی Entities رو به صورت استاتیک تعریف بکنم یا نه هر بار که از کلاس DataAccess یه آبجکت ایجاد می کنم شی Entities هم ساخته بشه و با از بین رفتن شی DataAccess ،شی Entities هم از بین بره؟


سلام . اول شما باید مشخص کنید که object tracking براتون مطرح هست یا نه. یعنی این داده هایی که دارید از دیتابیس میخونید رو فقط میخوای نمایش بدی یا علاوه بر اون میخوای اگه تغییری هم دادی بتونی از طریق همون container تو دیتا بیس ذخیره کنی.اگه هدفت فقط نمایش باشه میتونی از یه کلاس میانی با یه سری entity استاتیک استفاده کنی که البته به یه مشکل بر میخوری.و اونم اینه که یک static entity اگه با یک datacontainer مشخص خونده بشه باید از طریق همون datacontainer تو database ذخیره بشه و چون ممکنه چند بار بخایم عمل ویرایش رو انجام بدیم به مشکل بر میخوریم چون اولین datacontaner ای که static entity باهاش خونده شده ممکنه دیگه در اختیار نباشه و dispose شده باشه.
به نظر اگه دادهات فقط به منظور نمایش خونده میشن بهتره از یک کلاس میانی اسفاده کنی و اون property هایی که فقط بهشون احتیاج داری و روش map کنی .
اگه هم اعمال تغییرات برات مهمه بهتره از همون کلاسهای تولیدی خود EF استفاده کنی و از کلاس میانی اسفاده نکنی.
خلاصه باید بسته به شرایط برنامت یه راه بهینه رو انتخاب کنی

python_85
شنبه 27 اسفند 1390, 19:51 عصر
فکر کنم سوال من رو بد متوجه شدید(شاید هم من بد جوابتون رو متوجه دم)
فرض کنید یه بانک رو با EF یا LinqToSql مدل کردیم
به نظر شما نوشتن یه کلاس با یه آبجکت استاتیک از این مدل کار درستی هست ی نه
مثلا یه همچین کلاسی:


class DataAccess
{
private static test2Entities model;
public DataAccess()
{
if (model == null)
model = new test2Entities();
}
public List<Table_1> Fetch()
{
return model.Table_1.ToList();
}
public void insert(Table_1 Object)
{ model.Table_1.AddObject(Object);
model.SaveChanges();
}
public void Update(Table_1 Object)
{
var res= model.Table_1.Where(p => p.id == Object.id).FirstOrDefault();
res.name = Object.name;
model.SaveChanges();

}
public void Delete(Table_1 Object)
{
var res = model.Table_1.Where(p => p.id == Object.id).FirstOrDefault();
model.Table_1.DeleteObject(res);
model.SaveChanges();
}
}

hf1988
یک شنبه 28 اسفند 1390, 19:48 عصر
تو این کدایی که نوشتین فکر کنم تو سوال قبل من منظورتونو بد فهمیدم.منظور شما استفاده از یک datacontex به صورت static هست که مصداق بارزش در کد شما همون کلاس test2Entities هستش.
استفاده از یک datacontext به صورت static مشکلی نداره بازم بسته به اینکه شما چه چیزی مد نظرتون باشه.مثلا یه زمان هست که شما داده رو میخونید و فقط قصد نمایش دارید اینجا بهتره datacontext خودتون رو به نظرم satatic نگیرید . مثلا ..


using (test2Entities datacontext = new test2Entities())
{
List<Person> lstPerson = (from s in datacontext.persons select s).ToList();


}


در این حالت شما جدول رو خوندی و آوردی تو حافظه و حالا datacontext رو از بین بردی . چون فقط قصد نمایش اون lstPerson برات مهمه . ولی اگه بعدا بخایم تغییرات ثبت شده در اون لیست رو از طریق datacontext ای که باهاش خونده شدرو تو database ذخیره کنیم دیگه نمیتونیم چون datacontext رو از بین بردیم . پس این حالت به درد زمانی میخوره که قصد فقط نمایش رو داشته باشیم. اما..
در کدهایی که شما نوشتین از یه static datacontext استفاده کرددین .که البته بجای new کردنش در constructor میتونستین در خود پراپرتی این کارو انجام بدین به صورت :

private static test2Entities _DataContext;

public static test2Entities DataContext
{
get
{
if (_DataContext == null)
{
_DataContext = new test2Entities();
}
return _DataContext;

}
set { _DataContext = value; }
}


این حالت به درد زمانی میخوره که که بعداز اینکه اطلاعات رو توی lstPerson آوردی بعد از اینکه هر تغییری توی اون لیستت دادی هر جای برنامه savechange رو که اجرا کنی تغییراتت اعمال میشه . فقط یادت باشه هر بار که کارت با datacontext تموم شد dispose کنیش .

امیدوارم مطالب به دردتون خورده باشه.