PDA

View Full Version : چگونه از Lazy Loading استفاده کنیم؟



Wily_Fox
یک شنبه 20 مرداد 1392, 07:57 صبح
با سلام و خسته نباشید

من میخوام هنگامی که کاربر درخواست page ای رو میکنه هنگام ارسال اون page نظرات کاربران هم به همراه اون ارسال بشه.

واسه همین خواستم از Lazy Loading استفاده کنم. در نتیجه کلاس page هام و comment هام رو بشکل زیر تعریف کردم.


public class Page
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption .Identity)]
public long PageId { set; get; }

[Required]

[MaxLength(512)]
public string Abstract { set; get; }


[Required]
[MaxLength(128)]
public string Title { set; get; }

[Required]
public DateTime CreateDate { set; get; }

[Required]
public DateTime UpdateDate { set; get; }

public virtual IList<Comment> Comment { set; get; }
}



public class Comment
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption .Identity)]
public long CommentId { set; get; }

[Required]
public DateTime CreateDate { set; get; }

[Required]
public string Content { set; get; }

[Required]
public bool IsActive { set; get; }

[Required]
public long ParentId { set; get; }


[Required]
public long PageId { set; get; }
public virtual Page Page { get; set; }

public virtual IList<ConfirmComment> ConfirmComment { set; get; }
}


جهت استفاده query به شکل زیر نوشتم


return (from p in _Page
where p.PageId == id
select new PageViewModel
{

Comment = p.Comment,

CreateDate = p.CreateDate,

Title = p.Title,
UpdateDate = p.UpdateDate,

UserCreaterName=p.UserProfile.FirstName+" "+p.UserProfile.LastName
}).FirstOrDefault();



در اینجا
UserCreaterName=p.UserProfile.FirstName+" "+p.UserProfile.LastName

طبق Lazy Loading این دستور بدرستی انجام میشه.

اما در اینجا
Comment = p.Comment
طبق Lazy Loading باید Comment ، p.Comment رو مقداردهی کنه. اما مقدار نمی گیره! درواقع چیزی داخلش نیست که بتونه مقداردهی کنه.

متشکرم

parvizwpf
یک شنبه 20 مرداد 1392, 18:09 عصر
بنظرم اگه روابط رو میخواید اینطور بنویسید :
var a=db._Page.Include("Comment").....

Wily_Fox
دوشنبه 21 مرداد 1392, 13:16 عصر
در این روش Lazy Loading اتفاق نمی افته بلکه eager loading هست. اما من میخوام با استفاده از Lazy Loading اینکار رو بکنم

parvizwpf
دوشنبه 21 مرداد 1392, 19:03 عصر
http://stackoverflow.com/questions/11469432/entity-framework-code-first-lazy-loading

Wily_Fox
سه شنبه 22 مرداد 1392, 16:29 عصر
آیا هنگام insert کردن مقدار متغیر


public virtual Page Page { get; set; }


در داخل کلاس Comment رو هم باید مقدار دهی کنم؟

Wily_Fox
سه شنبه 22 مرداد 1392, 18:07 عصر
بله اونطور که مشخص شد بایستی


public virtual Page Page { get; set; }

بجای

public long PageId { set; get; }


مقداردهی شود. چون در این حالت Page به کلید خارجی مربوطه یعنی PageId اشاره می کند.
در واقع با تعریف
public virtual Page Page { get; set; } ما داریم کلید خارجی به نام Page_PageId تعریف می کنیم

در نتیجه نیازی به
public long PageId { set; get; } احساس نمیشود و بهتر است حذف گردد.

Wily_Fox
چهارشنبه 23 مرداد 1392, 14:24 عصر
یه مشکل دیگه هم هست اینکه:

هنگام Insert میگه حتما بایستی جستجو کنی page رو پیدا کنی و سپس توسط page مربوطه insert بکنی

مثلا:


var page = db.Page.Find(id);
var comment = new Comment
{
Content = "gsdfgdfgsdfgsdfg",
Page = page
};
db.Comment.Add(comment);
db.SaveChanges();


حتی میخوام این جستجو رو انجام ندم و بصورت زیر انجام بدم و اطلاعات بقیه فیلدهای page رو شانسی پر می کنم باز قبول نمی کنه و خودش یک رکورد جدید در page ذخیره می کنه و سپس کامنت مربوطه رو به اون رکورد جدید نسبت میده!!!!!!!



var page = new Page
{
PageId=1,
Name="sfsd"
};
var comment = new Comment
{
Content = "gsdfgdfgsdfgsdfg",
Page = page
};
db.Comment.Add(comment);
db.SaveChanges();


میشه دوستان منو راهنمایی کنید