Entity Framework در Xamarin

Entity Framework روز به روز در حال پیشرفته شدن است و جالب است که بدانید در حال توسعه entity framework Core است و بیشتر هدف این framework این است که ORM در آن حفظ شود و فضای زیادی را اشغال نکند.

Entity Framework در Xamarin

اکنون می خواهیم یک چالش را بیان کنیم:

ما می خواهیم در این چالش از Entity Framework  در پروژه های Xamarin  استفاده کنیم

در چند سال گذشته این امکان وجود نداشت که شما در پروژه های اندرویدی خود از این framework استفاده کنید

ابزارها

حالا می خواهیم در مورد ابزارها برای ایجاد این امکان که بتوانیم در پروژه هایمان از entity استفاده کنیم صحبت کنیم:

-SQLite Provider: برای افزودن اطلاعات از sqllite استفاده می شود ولی حالا ما باید بسته ی SQLite Entity Framework را به پروژه ی خود اضافه کنیم.

شما می توانید از این لینک استفاده کنید.

-Entity Framework Core: ما به یک ORM برای مدیریت عملیات CRUD نیاز داریم و همین طور برای مهاجرت پایگاه داده ی خود نیاز به بسته ی زیر را داریم.

می توانید از لینک زیر استفاده کنید

حالا کار ما شروع می شود:

ابتدا کتابخانه ی NetStandard را ایجاد کنید برای انجام ساخت یک پروژه شما باید یک پروژه ی PLC ایجاد کنید

از آنجایی که این کتابخانه استاندارد نیست با استفاده از تنظیمات ،باید به یک پروژه تبدیل کرد.

حالا باید دو بسته ی زیر را در پروژه ی خود نصب نمایید

لینک 1

لینک 2

برای اینکه مطمئن شویم از استانداردهای دات نت استفاده شده است مانند تصویر زیر باید آن را چک نماییم

ایجاد پروژه Xamarin.Android

در اینجا ما باید یک پروژه ی جدید ایجاد نماییم

File -> New Single-View App (Android) Project

اضافه کردن بسته ها Nuget

ساده ترین قسمت در پروژه ها اضافه کردن بسته ها است که شما می توانید بسته های مورد نیاز را اضافه نمایید

اضافه کردن بسته NuGet به کتابخانه استاندارد به صورت زیر است:

اضافه کردن بسته NuGet به پروژه Xamarin.Android

تعریف DbContext

اگر از قبل از Entity Framework استفاده کرده اید ، حالا می توانید از DbContext استفاده کنید

بیایید ابتدا یک کلاس ساده ایجاد کنید به صورت زیر:

  public class Cat
    {
        [Key]
        public int CatId { get; set; }
        public string Name { get; set; }
        public int MeowsPerSecond { get; set; }
    }

شما از catcontex استفاده می کنید که این کلاس از DBcontex ارث بری می کند ما در کد زیر آدرس دیتابیس خود را تعریف می کنیم

    public class CatContext : DbContext
    {
        public DbSet<Cat> Cats { get; set; }

        private string DatabasePath { get; set; }

        public CatContext()
        {

        }

        public CatContext(string databasePath)
        {
            DatabasePath = databasePath;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite($"Filename={DatabasePath}");
        }
    }

پیاده سازی Context

ابتدا ما باید مطمئن شویم که پروژه ی Xamarin.Android  به کتابخانه ی استاندارد نرم افزار پیوند دارد

حالا باید MainActivity.cs را با استفاده از Entity Framework بسازیم

[Activity(Label = "EntityFrameworkWithXamarin.Droid", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        int count = 1;

        protected async override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // Get our button from the layout resource,
            // and attach an event to it
            Button button = FindViewById<Button>(Resource.Id.MyButton);

            button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };

            TextView textView = FindViewById<TextView>(Resource.Id.TextView1);

            var dbFolder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
            var fileName = "Cats.db";
            var dbFullPath = Path.Combine(dbFolder, fileName);
            try
            {
                using (var db = new CatContext(dbFullPath))
                {
                    await db.Database.MigrateAsync(); //We need to ensure the latest Migration was added. This is different than EnsureDatabaseCreated.

                    Cat catGary = new Cat() { CatId = 1, Name = "Gary", MeowsPerSecond = 5 };
                    Cat catJack = new Cat() { CatId = 2, Name = "Jack", MeowsPerSecond = 11 };
                    Cat catLuna = new Cat() { CatId = 3, Name = "Luna", MeowsPerSecond = 3 };

                    List<Cat> catsInTheHat = new List<Cat>() { catGary, catJack, catLuna };

                    if(await db.Cats.CountAsync() < 3)
                    {
                        await db.Cats.AddRangeAsync(catsInTheHat);
                        await db.SaveChangesAsync();
                    }

                    var catsInTheBag = await db.Cats.ToListAsync();

                    foreach(var cat in catsInTheBag)
                    {
                        textView.Text += $"{cat.CatId} - {cat.Name} - {cat.MeowsPerSecond}" + System.Environment.NewLine;
                    }
                }

            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.ToString());
            }
        }
    }

باید سعی کنید این کد را اجرا کنید

Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 1: 'no such table: Cats'.

برای هر تغییر در دیتابیس می توانید شما از migration استفاده کنید

شما می توانید برای ایجاد پروژه ی خود از کتابخانه ی netstandard به netcore مهاجرت کنید

ما باید Entity Framework Tools و Entity Framework Core Design و Entity Framework Core را به پروژه ی خود مان اضافه کنیم

لینک 1

لینک 2

لینک 3

باید شما کلاس Cat.cs و CatContext.cs به کلاس DbContext انتقال دهید و بعد یک Migration  بزنید

حال باید یک Contex ایجاد کنیم با استفاده از ابزارهای دات نت شما یک کنسول جدید ایجاد نمایید

 باید شما یک Migration داشته باشید

 پوشه ی Migration ایجاد شد شما می توانید به سادگی namespace های آن را هم تغییر دهید

 باید پروژه ی Xamarin.Android را ایجاد کنید

اگر شما بخواهید یک نگاه دقیق تر داشته باشید می توانید از شبیه ساز های AMD استفاده کنید

یه پوشه ی data/data/files بروید

شما می توانید پنجره sqlite را باز کنید

و به صورت زیر خواهد بود

 آموزش برنامه نویسی اندروید با سی شارپ

فایل های ضمیمه