سلام
سریع میرم سر مشکلی که برای من به وجود آمده (که احتمال میدم یه جایی در تعریف کلاسها در حالت 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 میباشد
زمانی که از طریق روش 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; }
سپاس از شما
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)