انگیزه (هدف) از این نوشته، بررسی آن مفاهیمی است که پیش از این درباره رویکرد Code First، ساخت رابطه میان دو جدول در Entity Framework و درج داده ها در پایگاه داده گفته ایم. در اینجا می خواهیم برنامه GUI به کمک WinForms بنویسیم تا ورودی ها به جای کنسول، از واسط گرافیکی دریافت و سپس در جدول های درون پایگاه داده درج شوند.

گام یکم – آماده سازی پایگاه داده و کلاس های موجودیت

همانند دیگر نوشته های این دوره، برای این نوشته نیز از LocalDB کمک می گیریم، پس نخست پایگاه داده محلی را در پروژه بسازید. پروژه در برگیرنده دو جدول به نام بلاگ و نوشته ها (Post) که رابطه یک به چند میان آنها است، به گونه ای که هر بلاگ دارای چندین نوشته ولی هر نوشته تنها برای یک بلاگ است. بر پایه رویکرد Code First نیاز داریم تا دو کلاس موجودیت به نام  Blog و Post را داشته باشیم که درون کلاس Post باید کلید بیرونی (خارجی) به جدول Blog شناسانده (تعریف) شده باشد.

  • کلاس یا جدول Blog دارای دو ویژگی به نام BlogId برای کلید اصلی، Name برای نگهداری نام بلاگ است.
  • کلاس یا جدول Post دارای چهار ویژگی به نام PostId برای کلید اصلی، Title و Body برای دریافت عنوان و بدنه و محتوای پست و BlogId که بیرونی به جدول Blog است.

سه کلاس زیر به ترتیب کلاس های Blog و Post و BloggingContext را نشان می دهند که در آنها BloggingContext همان کلاس Context است از کلاس پایه DbContext ارث بری کرده است. همانگونه که می بینید، چون هر بلاگ دارای چندین نوشته است، پس درون کلاس Blog یک ویژگی ICollection هست که به کلاس Post اشاره دارد.

گام دوم- درج داده ها در جدول های رابطه یک به چند

کد زیر چگونگی درج داده ها برای دو جدول با رابطه یک به چند را نشان می دهد. توجه کنید هر بلاگ می تواند چندین نوشته داشته باشد، پس BlogId در جدول Post کلید خارجی به جدول Blog است، پس باید نخست سطرهایی از جدول Blog را داشته باشیم که سپس مقدار ستون BlogId آنها را به ستون BlogId جدول Post بدهیم. بنابراین در کد زیر، نخست سطرهایی برای جدول Blog ساخته و به پایگاه داده فرستاده می شوندو در اینجا دو بلاگ به نام های Blog1 و Blog2 ساخته ایم. سپس یک پرس و جوی ساده را آماده کرده ایم که به کمک متد ()FirstOrDefault، سطر یا سطرهایی از جدول را برگشت می دهد که مقدار ستون name آن، برابر با Blog1 است، زیرا می خواهیم، نوشته ای به این بلاگ بدهیم. توجه کنید همراه پرس و جو، مقدار هر دو ستون BlogId و Name برگشت داده می شوند.

سپس در خط های 11 و 12 دو نمونه از کلاس Post ساخته ایم که مقدار ویژگی BlogId آن برابر با مقدار ویژگی BlogId از سطری است که پیش از این در خط  9 بدست آورده بودیم. در واقع نخست بلاگ را ساختیم، سپس آن بلاگی که می خواهیم نوشته ها را به آن بدهیم را از جدول و در خط واکشی کردیم و سپس دو نمونه Post ساختیم و با انتساب مقدار BlogId آنها با مقدار BlogId از سطر Blog خط پیشین، نشان دادیم که این نوشته ها برای کدامین بلاگ هستند.

در پایان می خواهیم سطرهای دو جدول را با کمک عبارت join در LINQ با یکدیگر ادغام کرده و سپس آنها را به یک List  تبدیل کنیم تا در خروجی نمایش دهیم. در عبارت join بالا، تنها سه ستون Name از کلاس Blog و دو ستون Titles و Body از کلاس Post را می خواهیم، پس پیش روی عبارت select به کمک عبارت new متغیرهای تازه ای به نام BlogName و PostTitle و PostBody ساخته ایم و به ترتیب آنها را با مقدار ویژگی Name از کلاس Blog و ویژگی های Title و Body مقدار دهی کرده ایم. بنابراین می توانیم عبارت join سی شارپ بالا را با عبارت SQL زیر همسان بدانیم.

Join کردن در Entity Framework با Linq to Entity

دانلود سورس کد این نوشته Insert One to Many with EF6

روش دیگر برای درج

در کد بالا، نخست بلاک دلخواه را از پایگاه داده واکشی کردیم و سپس مقدار ویژگی BlogId آن را به ویژگی BlogId نوشته ها دادیم. در کد زیر که نمونه دیگری از درج داده ها در رابطه یک به چند است، بازهم در خط 3 بلاگ دلخواه را واکشی کردیم و نتیجه در متغیری به نام blog نگهداری می شود. سپس یک لیست از پست ها ساختیم  که انگیزه آن است تا متد ()AddReange را به کار ببریم. تفاوت کد در همان تعریف لیست Post ها است به این گونه که این بار دیگر ویژگی BlogId آن را مقدار دهی نکردیم، بلکه سر راست ویژگی Blog هر نمونه Post را با خود متغیر blog (خط 3) مقدار دهی کردیم.

ولی چرا می توانیم یکباره یک نمونه کلاس Blog را به نمونه های کلاس Post بدهیم؟ پاسخ این است که زیرا اگر به کد دوم همین نوشته برای کلاس Post نگاه کنید، می بینید پایان کلاس ویژگی به گونه virtual و به گونه public virtual Blog Blog نوشته شده است. همچنین در کد بالا، دوباره یک عبارت join از Linq نوشته ایم ولی این بار یک عبارت where برای شرط اینکه نام بلاگ برابر با Blog2 باشد نیز در پرس وجوی فرستاده شده به پایگاه داده است. کد SQL زیر، همسان با پرس و جوی واپسین (آخرین) کد این نوشته است.

دانلود واپسین کد این نوشته Insert One to Many with EF6 – 2