رمز EF أولاً لا يعيد الكائنات ذات الصلة
-
26-09-2019 - |
سؤال
أنا أستخدم رمز EF أولاً مع قاعدة بيانات موجودة مسبقًا.
كائنين:
public Foo
{
public int FooId {get;set;}
}
public Bar
{
public int BarId {get;set;}
public virtual Foo Foo {get;set;}
}
كلاهما FooId
و BarId
هي المفاتيح الأساسية في قاعدة البيانات ، و Bar
يحتوي الجدول على عمود FooId
وهو مفتاح خارجي يشير إلى Foo
الطاولة.
عندما أختار أ Bar
, Foo
هو مرجع فارغ. كنت أعتقد أن EF كان سيجمع اثنين منهم تلقائيًا ، لكن ربما أفتقد شيئًا؟
تعيينات قاعدة البيانات:
public class EFCodeFirst : DbContext
{
public EFCodeFirst()
{
this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["AlternateString"].ConnectionString;
}
public DBSet<Foo> Foos {get;set;}
public DBSet<Bar> Bars {get;set;}
protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
{
modelBuilder.IncludeMetadataInDatabase = false;
modelBuilder.Entity<Foo>().MapSingleType().ToTable("Foo");
modelBuilder.Entity<Bar>().MapSingleType().ToTable("Bar");
}
}
المحلول
إذا لم يكن توقعك من فو ، فلا غنى عن حقيقة أنك تصنعها افتراضية على الكائن الشريطي ، هذا ليس هو الحال. من خلال جعلها افتراضية ، يمكنك فقط اختيار التحميل الكسول EF وسيتم تشغيله حتى إلى حد أن تطلب ذلك صراحة عن طريق الوصول إليه على كائن الشريط. بخلاف ذلك ، إذا كنت تريد أن يتم ملؤها مقدمًا ، فسيتعين عليك تحميلها مع تضمن طريقة.
لتعطيل تحميل كسول بشكل صريح ، يمكنك استخدام الكود التالي ، على الرغم من أنك لا تحتاجه لأنه يمكنك فقط إزالة افتراضية ستختفي الكلمة الرئيسية من خصائص التنقل والتحميل الكسول.
public EFCodeFirst()
{
this.ObjectContext.ContextOptions.LazyLoadingEnabled = false;
}
داخليًا ، يستخدم DBContext a محمي ObjectContext التي يمكنك استخدامها أيضًا داخل فئة DBContext الموروثة (على سبيل المثال efcodeFirst).
نصائح أخرى
أنت تفتقد خطًا في فئة FOO ، حيث تحتوي FOO على مجموعة من البار.