اگریگیت بندی کردن انتیتی ها

سوال شده توسط: bzmind ‌

تاریخ ثبت: ۱۴۰۰/۱۱/۲۸

بازدید: 1,141

پاسخ: 4

تگ: Asp.net Core


سلام،

استاد الان اگر ما یه انتیتی Comment داشته باشیم که 2 تا اگریگیت متفاوت، به این انتیتی کامنت نیاز دارند، و همچنین اگر ما یه محصول رو حذف کنیم، اینکه تمام کامنت هاش هم حذف شه منطقی هست، الان تکلیف این انتیتی comment چی میشه؟ خودش باید اگریگیت روت باشه، یا زیر مجموعه اگریگیت Product باشه.

1 - باید یه اگریگیت روت باشه خودش، چون 2 تا اگریگیت متفاوت بهش نیاز دارند، و اگر کامنت رو به صورت آبجکت توی پراپرتیز هاشون رفرنس بدن کارشون راحت تر میشه.

2 - باید زیر مجموعه اگریگیت Product باشه، چون با حذف کردن یک انتیتی Product، حذف کردن کامنت های اون پروداکت هم منطقی هست.

سوالم رو بخوام واضح تر بگم این میشه که، آیا هروقت یه انتیتی داشتیم که حذف شدنش وابسته هست به حذف شدن یه انتیتی دیگه، (اینجا حذف شدن کامنت وابسته هست به حذف شدن پروداکت، و منطقی هست) در این صورت، “حتما و به اجبار” باید این انتیتی وابسته بره زیر مجموعه اون اگریگیت بشه؟ چون حذف شدنشون با هم منطقی هست؟

یا میشه این قانون رو زیر پا زاشت، و مثلا با اینکه وابسته هستن، کامنت به صورت مستقل، اگریگیت خودش رو داشته باشه؟

ممنون

پاسخ ها
user

محمد اشرافی

سلام ، ببینید توی ساخت Domain با اصول DDD دیگه خیلی به Navigation property ها دل خوش نکنید ، و به این فکر نکنید که من اینجا یک لیست میزارم و توی ui از همین استفاده میکنم ، کلا این طرض فکر برای این نوع معماری اشتباه ه 

-----------------------------------

توی این سناریو که شما دارید ، بهتره تبدیل بشه به یک Aggregate جدا 

public class Comment:AggregateRoot
{
	publid long LinkId {get;set;}  //ProductId or ArticleId
	public	CommentType Type {get;set;}
	... 
}
public enum CommenType
{
	Product,
	Article
}

-----------------------------------------

نه توی Product و نه توی Article نباید Navigation Property داشته باشه ، برای واکشی از خود دیتابیس بر اساس ProductId یا ArticleId  واکشی میشه

user

bzmind ‌

ینی توی کلاس Product من هیچ Navigation Property ای واسه کامنت ها نزارم؟ پس موقع حذف Product چجوری کامنت هاش رو هم حذف کنم؟

بعد من توی کلاس Customer چه پراپرتی ای قرار بدم برای کامنت های کاستومر؟

راستی من تو پروژم انتیتی به اسم Article ندارم، فقط اینان: Category, Product, Customer, Order با زیر مجموعه های توی اگریگیت هاشون

user

محمد اشرافی

  1. نه لازم نیست ، موقع حذف بر اساس ProductId میرید Comment هارو پیدا میکنید و حذف میکنید
  2. هیچی لازم نیست توی Customer بزارید
  3. فقط مثال زدم ، که بدونید میشه همچین کاری انجام داد ( یک جدول کامت برای چندین جا)
user

mohammad ghasemi

سلام استاد. 

من اگر بخوام Basket مشتری رو برگردونم به همراه محصولاتش باید بین BasketItem که ProductId داره یه Join بزنم که بیارم .

آیا من باید یه کوئری بنویسم توی ریپوزیتوری Basket ک جوین بزنم با product یا  navigation بزنم بین BasketItem  و Product ؟

برای ثبت پاسخ باید خود شوید

محبوب ترین مقالات