View Full Version : حرفه ای: از کجا بفهمیم در رابطه خود ارجاع یک رکورد پدر است و فرزند دارد؟
سعید کشاورز
سه شنبه 12 تیر 1397, 23:08 عصر
سلام دوستان...
یک جدول دسته بندی رو در نظر بگیرید..
مثلا به صورت زیر و ساختار درختی:
خبر
ورزشی
فوتبال
والیبال
بسکتبال
شنا
علمی
هنری
مقالات
حالا توسط 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
سه شنبه 12 تیر 1397, 23:14 عصر
سلام، لطفا ساختار کلاستون رو بذارین
سعید کشاورز
سه شنبه 12 تیر 1397, 23:22 عصر
سلام، لطفا ساختار کلاستون رو بذارین
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; }
}
mr.sirwan
سه شنبه 12 تیر 1397, 23:35 عصر
به نظرم باید یه لیست از فرزندان هم توی کلاس تعریف کنین، به این شکل:
public virtual ICollection<ProfileCategory> ProfileCategoryChilds { get; set; }
سعید کشاورز
سه شنبه 12 تیر 1397, 23:45 عصر
به نظرم باید یه لیست از فرزندان هم توی کلاس تعریف کنین، به این شکل:
public virtual ICollection<ProfileCategory> ProfileCategoryChilds { get; set; }
دقیقا همین رو هم قرار دادم ..اما وقتی دیباگ میکنم Count فرزند رو 0 میزنه..بای اینکه Include هم میکنم
mr.sirwan
چهارشنبه 13 تیر 1397, 00:03 صبح
برای ایجاد این رابطه باید از FluentAPi استفاده کنید، ببینین این کمکی میکنه:
modelBuilder.Entity<ProfileCategory>()
.HasOptional(pc=>pc.Parent)
.WithMany(pc=>pc.Childs)
.HasForeignKey(pc=>pc.ParentId);
فقط حواستون باشه که لیست childs رو توی سازنده new کنین
Mahmoud.Afrad
چهارشنبه 13 تیر 1397, 01:45 صبح
.......
جای علامت سوال چی باید بذارم؟
lstCategory.Any(item=> item.ParentId==e.id)
سعید کشاورز
چهارشنبه 13 تیر 1397, 10:12 صبح
برای ایجاد این رابطه باید از 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
{
}
unique2017
چهارشنبه 13 تیر 1397, 10:28 صبح
کاربرد این مطلب را هم میگوئید؟
ali_md110
پنج شنبه 14 تیر 1397, 03:41 صبح
جهت مدل های خودارجاع دهنده نیازی به کانفیگ 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
و سازنده ها را از کلاسهاتون حذف کنید
سازنده ها را در کلاس های ویومدل بکار ببرید
ودر پاسخ به سوال اولتون فیلدی که نال هست میشود رکورد پدر و کالکشن های زیر مجموعه آن میشود رکوردهای فرزند آن سطر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.