سؤال

أنا أستخدم رمز 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 على مجموعة من البار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top