از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
سلام دوستان...
یک جدول دسته بندی رو در نظر بگیرید..
مثلا به صورت زیر و ساختار درختی:
حالا توسط Ef از کجا میشه فهمید که یک رکورد دارای فرزند است؟
----------------------
یه جدول دارم به اسم Category
یه پراپرتی گرفتم برای ایجاد رابطه خود ارجاع به صورت زیر :
public Category Parent { get; set; }
الان رابطه ایجاد شده و مشکلی نیست..
حالا من لیست همه دسته بندی هارو داخل یک متغیر از نوع var میریزم.. و میخام تبدیل به ViewModel کنم
به صورت زیر:
var lst = from e in lstCategory
where (id.HasValue ? e.ParentId == id : e.ParentId == null)
select new CategoryViewModel
{
Id = e.Id,
Name = e.Name,
HasChildren = ؟؟؟؟؟؟؟
};
داخل Viewmodel یه پراپرتی دارم از توع Bool به نام HasChildren
حالا میخام بفهم اگر دسته بندی پدر بود مقدار True داخلش قرار بگیره..
جای علامت سوال چی باید بذارم؟
نقل قول: از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
سلام، لطفا ساختار کلاستون رو بذارین
نقل قول: از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
نقل قول:
نوشته شده توسط
mr.sirwan
سلام، لطفا ساختار کلاستون رو بذارین
public class Category : BaseEntity
{
public Category()
{
CreateDate = DateTime.Now;
ViewCount = 0;
IsPublished = false;
ShowInSiteCategory = false;
Profiles = new HashSet<Profile>();
}
/// <summary>
/// نام دسته بندی
/// </summary>
public string Name { get; set; }
/// <summary>
/// عنوان صفحه اچ تی ام ال
/// </summary>
public string PageTitle { get; set; }
/// <summary>
/// توضیحات کامل دسته بندی
/// </summary>
public string Content { get; set; }
/// <summary>
/// متا تگ سئو
/// </summary>
public string MetaTag { get; set; }
/// <summary>
/// کلمات کلیدی
/// </summary>
public string Keyword { get; set; }
/// <summary>
/// تصویر
/// </summary>
public string ImagePath { get; set; }
/// <summary>
/// آدرس سئو بهینه برای گوگل
/// </summary>
public string SlugUrl { get; set; }
/// <summary>
/// تگ Strong برای سئو
/// </summary>
public string StrongText { get; set; }
/// <summary>
/// آمار بازدید بر حسب کلیک
/// </summary>
public int ViewCount { get; set; }
/// <summary>
/// منتشر شدن دسته بندی
/// </summary>
public bool IsPublished { get; set; }
/// <summary>
/// نمایش در لیست دسته بندی های سایت
/// </summary>
public bool ShowInSiteCategory { get; set; }
/// <summary>
/// ترتیب نمایش
/// </summary>
public int DisplayOrder { get; set; }
/// <summary>
/// تاریخ ایجاد
/// </summary>
public DateTime CreateDate { get; set; }
/// <summary>
/// دسته والد
/// </summary>
public int? ParentId { get; set; }
public ProfileCategory Parent { get; set; }
public virtual ICollection<Profile> Profiles { get; set; }
public virtual ICollection<ProfileTag> ProfileTags { get; set; }
}
نقل قول: از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
به نظرم باید یه لیست از فرزندان هم توی کلاس تعریف کنین، به این شکل:public virtual ICollection<ProfileCategory> ProfileCategoryChilds { get; set; }
نقل قول: از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
نقل قول:
نوشته شده توسط
mr.sirwan
به نظرم باید یه لیست از فرزندان هم توی کلاس تعریف کنین، به این شکل:
public virtual ICollection<ProfileCategory> ProfileCategoryChilds { get; set; }
دقیقا همین رو هم قرار دادم ..اما وقتی دیباگ میکنم Count فرزند رو 0 میزنه..بای اینکه Include هم میکنم
نقل قول: از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
برای ایجاد این رابطه باید از FluentAPi استفاده کنید، ببینین این کمکی میکنه:
modelBuilder.Entity<ProfileCategory>()
.HasOptional(pc=>pc.Parent)
.WithMany(pc=>pc.Childs)
.HasForeignKey(pc=>pc.ParentId);
فقط حواستون باشه که لیست childs رو توی سازنده new کنین
نقل قول: از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
نقل قول:
نوشته شده توسط
سعید کشاورز
.......
جای علامت سوال چی باید بذارم؟
lstCategory.Any(item=> item.ParentId==e.id)
نقل قول: از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
نقل قول:
نوشته شده توسط
mr.sirwan
برای ایجاد این رابطه باید از FluentAPi استفاده کنید، ببینین این کمکی میکنه:
modelBuilder.Entity<ProfileCategory>()
.HasOptional(pc=>pc.Parent)
.WithMany(pc=>pc.Childs)
.HasForeignKey(pc=>pc.ParentId);
فقط حواستون باشه که لیست childs رو توی سازنده new کنین
مرسی...مشکل از کانفیگ کردنم بود
الان من childs رو توی سازنده new که میکنم ریشاپر میگه که باید یه سری تغییرات بدی... علتش چیه؟
وقتی کاراشو میزنم انجام بده تمام پراپرتی هایی که virtual هستند رو کلمه virtual رو ازشون حذف میکنه وکلاس رو به این صورت تغییر میده کلمه sealed به کلاس اضافه میکنه
public sealed class Category : BaseEntity
{
}
نقل قول: از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
کاربرد این مطلب را هم میگوئید؟
نقل قول: از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
جهت مدل های خودارجاع دهنده نیازی به کانفیگ fluent نیست خود ef اینها را مدیریت میکند
این مدل ProfileCategory یک مدل به جز Category هست؟
public ProfileCategory Parent { get; set; }
اگر اینطور هست مدل شما خود ارجاع دهنده نیست
کلاس زیر در نظر بگیرید این یک مدل خود ارجاع دهنده هست
public class Menu
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
[ForeignKey("ParentId")]
public virtual Menu Parent { get; set; }
public virtual int? ParentId { get; set; }
public virtual ICollection<Menu> Childs { get; set; }
}
این یک مدل خو ارجاع دهنده هست
جهت کلاسهای poco به این نکته توجه کنید:
فیلدهای کلاسهاتون مخصوصا فیلدهای navigation propertyبصورت virtual تعریف کنید جهت lazy loading
و سازنده ها را از کلاسهاتون حذف کنید
سازنده ها را در کلاس های ویومدل بکار ببرید
ودر پاسخ به سوال اولتون فیلدی که نال هست میشود رکورد پدر و کالکشن های زیر مجموعه آن میشود رکوردهای فرزند آن سطر