مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

farshad_pickup

عضویت از 1394/04/18

تفاوت در واکشی اطلاعات توسط EF در حالت Code First و DB First (سوال)

  • سه شنبه 4 اردیبهشت 1397
  • 13:03
تشکر میکنم

سلام

سریع میرم سر مشکلی که برای من به وجود آمده (که احتمال میدم یه جایی در تعریف کلاسها در حالت CODE FIRST  باشه)

این جدول هارا در نظر بگیرید

public class Anbar
    {

        [Key]
        [DisplayName("شناسه")]
        public int Id { get; set; }
        [DisplayName("کد")]
        public string Code { get; set; }

        [DisplayName("انبار فیزیکی")]
        public Warehouse Warehouse { get; set; }

        public ICollection<Portfolio> Portfolio { get; set; }
        public ICollection<Transactions> Transactions { get; set; }

    }

و این جدول

 public class Warehouse
    {
        [Key]
        [DisplayName("شناسه")]
        public int Id { get; set; }
        [DisplayName("نام")]
        public string Name { get; set; }
        [DisplayName("آدرس")]
        public string Adress { get; set; }

        public ICollection<Anbar> Anbar { get; set; }
    }

همانطور که مشخص هست یک رابطه یک به چند بین انبار فیزیکی (WareHouse) و مجازی (Anbar) وجود دارد این موجودیتها به صورت code first  در پایگاه داده ایجاد شده اند

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }


        public DbSet<Warehouse> Warehouse { get; set; }
        public DbSet<Anbar> Anbar { get; set; }


        {

            modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>();            
            base.OnModelCreating(modelBuilder);
        }
    }

مساله اصلی این حالت است که در زمان واکشی اطلاعات

Anbar anbar = db.Anbar.FirstOrDefault(T => T.Id == AnbarID);

anbar.wareHouse برابر null خوانده می شود ولی برای تست همین پایگاه داده ساخته شده توسط کد را در یک پروژه دیگه به صورت db first  وارد کردم یعنی Model  را به صورت Ado.NetEntityDataModel و  EF DEsigner from database

و ارد کردم و در این حالت این برای این واکشی

Anbar anbar = db.Anbar.FirstOrDefault(T => T.Id == AnbarID);

مقدار wareHouse  دیگر null  نیست  و آبجکت مقدار درست را دارد

به نشر شما مشکل از کجاست؟ چطور در حالت Code First  مقدار جداول مرتبط درست واکشی نمیشود و null میباشد

پاسخ های این پرسش

تعداد پاسخ ها : 2 پاسخ
کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • سه شنبه 4 اردیبهشت 1397
  • 19:00

زمانی که از طریق روش DbFirst مدل خود را ایجاد می کنید EF برروی رابطه های شما یا همان Navigation property کلمه کلیدی virtual را قرار می دهید و این به آن معنی است که lazy lading فعال شده است. برای حل این مشکل دو را کار وجود دارد یا این که از virtual برای فعال کردن lazy loading از virtual استفاده کنیم یا این که به صورت egar load آن را توسط متد Include واکشی کنیم

Anbar anbar = db.Anbar.Include(x => x.wareHouse).FirstOrDefault(T => T.Id == AnbarID);

یا

        public virtual Warehouse Warehouse { get; set; }

کاربر سایت

farshad_pickup

عضویت از 1394/04/18

  • چهارشنبه 5 اردیبهشت 1397
  • 11:00

سپاس از شما

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)