PDA

View Full Version : کاربرد ComplexType در EF CodeFirst چیست ؟



HOSSEINONLINE7
چهارشنبه 08 مرداد 1393, 01:09 صبح
سلام در مورد کاربرد خاصیت Complex Type در EF CodeFirst مطالبی خوندم و مثالهایی را دیدم سعی کردم پیاده کنم ولی باز متوجه نشدم .

به کلاسهام که قراره جدول بشه [Complex Type] دادم ولی اصلا تغییری در دیتابیس ندیدم و با حالتی که از این خاصیت استفاده نمیکردم جدولم تفاوتی نداشت .

لطفا توضیحی در موردش برام بدید ...

تشکر

r4hgozar
چهارشنبه 08 مرداد 1393, 09:24 صبح
سلام.
وقتی از complex type استفاده کنی. به عنوان مثال اگه جدولت user باشه و در جدول دیگه ای از اون استفاده کرده باشی و یا به عنوان مثال اسم یک خاصیت رو ID گذاشته باشی.
بنا به اسمی که تو complex type داری به عنوان مثال اگه یوزر باشه در دیتابیس به جای اینکه ID سیو بشه بطور خودکار میشه USER-ID و بقیه عناصر هم به همین صورت.

HOSSEINONLINE7
چهارشنبه 08 مرداد 1393, 13:58 عصر
سلام.
وقتی از complex type استفاده کنی. به عنوان مثال اگه جدولت user باشه و در جدول دیگه ای از اون استفاده کرده باشی و یا به عنوان مثال اسم یک خاصیت رو ID گذاشته باشی.
بنا به اسمی که تو complex type داری به عنوان مثال اگه یوزر باشه در دیتابیس به جای اینکه ID سیو بشه بطور خودکار میشه USER-ID و بقیه عناصر هم به همین صورت.

خوب من اومدم توی یکی از کلاسهای جدولم Complex type را گذاشتم و رفتم دیدم جدولی که برام ساخته شده بود فیلدها به همین صورتی که گفتید هست : User_Person

بعد اومدم Complex Type را برداشتم ببینم چه تغییری میکنه ولی بازم فیلدهام همونطوری ساخته شد !

پس چه Complex type را برداشتم فرقی نکرد ؟

r4hgozar
چهارشنبه 08 مرداد 1393, 14:52 عصر
سلام.
دیتابیس رو پاک کرده بودین؟؟
به نظرم باید کد رو بزارین تا بشه بیشتر راهنمایی کرد

HOSSEINONLINE7
چهارشنبه 08 مرداد 1393, 19:56 عصر
سلام.
دیتابیس رو پاک کرده بودین؟؟
به نظرم باید کد رو بزارین تا بشه بیشتر راهنمایی کرد

بله پاک کردم و در سازنده ی DataContext از :
Database.SetInitializer
(new System.Data.Entity.DropCreateDatabaseIfModelChange s<DatabaseContext>());

استفاده کردم .

این کلاسهای منه :

1. کلاس Person :

[Key]
public int PersonId { get; set; }
public string Name { get; set; }
public string Family { get; set; }
public Address Address{get; set;


کلاس Address که براش Complex Type قرار داده شده :

public int Id { get; set; }
public string Country { get; set; }

public string City { get; set; }

public string State { get; set; }

در DataContext برای ساخت جدول یک لیست از Person ساختم :

public DbSet<Person> Persons { get; set; }


با این کدها یک جدول Person ساخته میشه و فیلدهایی که برای کلاس آدرس ساخته میشن به این شکل هستن :

Address_Country
Address_City
Address_State

حالا اگه Complex type را از کلاس Address بردارم بازم همینطوری ساخته میشن !

Mohammadm
چهارشنبه 08 مرداد 1393, 23:29 عصر
استفاده از کامپلکس برای کلاسهایی بکار میرود که کاربر یا برنامه نویس نمیخواهد جدولی مطابق کلاس مورد نظر توسط entity درون دیتابیس ایجاد گردد و بلکه به عنوان مکمل کلاسهای دیگر مورد استفاده قرار گیرد و کلاسهای کامپلکس از طریق ایجاد یک شیئ درون کلاسهای دیگر مورد استفاده قرار میگیرند یعنی زمانیکه یک شی از این کلاس کامپلکس درون کلاسهای دیگر ایجاد شود پس از اجرای برنامه فیلدهای کلاس کامپلکس درون جدول کلاس مقصد توسط entity با فرمتی که در پست 2 گفته شد ایجاد میشود

HOSSEINONLINE7
پنج شنبه 09 مرداد 1393, 07:38 صبح
استفاده از کامپلکس برای کلاسهایی بکار میرود که کاربر یا برنامه نویس نمیخواهد جدولی مطابق کلاس مورد نظر توسط entity درون دیتابیس ایجاد گردد و بلکه به عنوان مکمل کلاسهای دیگر مورد استفاده قرار گیرد و کلاسهای کامپلکس از طریق ایجاد یک شیئ درون کلاسهای دیگر مورد استفاده قرار میگیرند یعنی زمانیکه یک شی از این کلاس کامپلکس درون کلاسهای دیگر ایجاد شود پس از اجرای برنامه فیلدهای کلاس کامپلکس درون جدول کلاس مقصد توسط entity با فرمتی که در پست 2 گفته شد ایجاد میشود

بله متوجه شدم و حالا اومدم پیاده سازیش کنم ولی چه کامپلکس بزارم چه نزارم باز فیلدها با همون فرمت ساخته میشن .

کدی که نوشتم صحیحه ؟

Mohammadm
پنج شنبه 09 مرداد 1393, 16:03 عصر
زمانیکه کلاس رو از نوع کامپلکس ایجاد نکنیم یک جدول مجزا برای کلاس مورد نظر ایجاد خواهد شد ، بنابراین توی کلاس person نباید فیلدی از کلاسهای address با همان فرمتهایی که گفتید ایجاد شده باشد شاید شما توی کد نویسی دوچار مشکل شدید بهتره برنامتون رو اینجا قرار بدید تا دوستان کمکتون کنند بنظر من شما ابتدا دیتابیستون رو DELETE و دوباره برنامتون رو اجرا کنید اگر حل نشد برنامتون رو اینجا قرار دهید

r4hgozar
پنج شنبه 09 مرداد 1393, 16:45 عصر
سلام.
از نظر من برنامتون درسته.
به قول دوستمون شاید جای دیگه ایراد داره.

keiv@n
پنج شنبه 28 اسفند 1393, 09:14 صبح
زمانیکه کلاس رو از نوع کامپلکس ایجاد نکنیم یک جدول مجزا برای کلاس مورد نظر ایجاد خواهد شد ، بنابراین توی کلاس person نباید فیلدی از کلاسهای address با همان فرمتهایی که گفتید ایجاد شده باشد شاید شما توی کد نویسی دوچار مشکل شدید بهتره برنامتون رو اینجا قرار بدید تا دوستان کمکتون کنند بنظر من شما ابتدا دیتابیستون رو DELETE و دوباره برنامتون رو اجرا کنید اگر حل نشد برنامتون رو اینجا قرار دهید

دوست عزیز تا زمانیکه از کلاس مورد نظر کالکشن نسازی تبدیل به جدول نخواهد شد حالا چه نوعش کامپلکس باشه چه نباشه ....
فرض کنید دو عدد کلاس داریم : کلاس اول و کلاس دوم ... کلاس اول به عنوان خاصیت در کلاس دوم استفاده شده است حال اگر کلاس اول فاقد کلید باشد به صورت اتوماتیک به کامپلکس تایپ تبدیل میشود .... و نیازی نیست خاصیت complexType رو در هدر کلاس تعریف کنید ....
حالت دوم اگر کلاس اول دارای فیلد کلید باشد آنگاه در صورت ذکر نکردن complexType در هدر کلاس ، دیگر به صورت کامپلکس تایپ در نظر گرفته نخواهد شد و خودش در خروجی به یک جدول تبدیل می شود....(یعنی در خروجی برای کلاسهای اول و دوم ، دو عدد جدول تشکیل خواهد شد !!)
و حالت سوم اگر کلاس اول دارای فیلد کلید باشد و نیز در هدر کلاس از complexType استفاده کنیم آنگاه برنامه فیلد کلید این کلاس را در نظر نمی گیرد و در خروجی این کلاس به صورت کامپلکس تایپ تبدیل خواهد شد (یعنی در خروجی کلاسهای اول و دوم به یک جدول تبدیل خواهند شد)