ปิดการใช้งานการกำหนดค่าอย่างถาวร ProxyCreationEnabled ใน EF หรือไม่

แทนที่จะต้องทำสิ่งต่อไปนี้ในทุก ๆ แบบสอบถาม มีวิธีตั้งค่านั้นแบบสากลหรือไม่ มีการตั้งค่าการโหลดแบบ Lazyloading ในมุมมองโมเดล แต่ดูเหมือนว่าจะไม่มีการตั้งค่าสำหรับ ProxyCreation

        using (var context = new LabEntities())
        {
            **context.Configuration.ProxyCreationEnabled = false;**

            var Query = from s in context.EAssets
                        .Include("Server").Include("Type").Include("Type.Definition")
                        where (s.Type.Definition.b_IsScannable == true) &&
                        (s.Server.s_Domain == Environment.UserDomainName || s.Server.s_Domain == null)
                        select s;
           var Entities = Query.ToList();
        }

ฉันไม่เข้าใจประโยชน์ของตัวเลือกนี้อย่างถ่องแท้ แต่ฉันรู้ว่าใน Visual Studio มีการแท็กอ็อบเจ็กต์ทั้งหมดของฉันด้วยคำต่อท้ายซีเรียลที่ไม่มีความหมาย และทำให้การใช้ดีบักเกอร์นั้นไม่มีเหตุผล


person jwrightmail    schedule 13.10.2012    source แหล่งที่มา


คำตอบ (2)


คุณสามารถปิดการใช้งานได้ใน Constructor เพื่อปิดการใช้งานทุกครั้งที่คุณสร้างบริบทใหม่:

public class LabEntities : DbContext
{
   public LabEntities()
   {
      Configuration.ProxyCreationEnabled = false;
   }
}
person Mark Oreta    schedule 13.10.2012
comment
แล้วปัญหาในการดูแลการสร้างไฟล์อัตโนมัติที่เกิดขึ้นหากคุณรีเฟรชโมเดลล่ะ การแก้ไขด้วยตนเองจะไม่ถูกเขียนทับใช่ไหม? - person jwrightmail; 15.10.2012
comment
มีปัญหาอะไรกับการสร้างไฟล์อัตโนมัติ? - person Mark Oreta; 15.10.2012
comment
หากต้องการปิดใช้งานในตัวสร้าง คุณต้องแก้ไขไฟล์ที่สร้างขึ้นโดยอัตโนมัติ ในกรณีของฉัน datamodel.context.cs ‹สร้างอัตโนมัติ› // โค้ดนี้สร้างจากเทมเพลต // // การเปลี่ยนแปลงไฟล์นี้ด้วยตนเองอาจทำให้เกิดพฤติกรรมที่ไม่คาดคิดในแอปพลิเคชันของคุณ // การเปลี่ยนแปลงไฟล์นี้ด้วยตนเองจะถูกเขียนทับหากมีการสร้างโค้ดใหม่ // ‹/สร้างอัตโนมัติ› - person jwrightmail; 15.10.2012
comment
โอ้คุณกำลังใช้ edmx - เอนทิตีสร้าง OnContextCreated() บางส่วน - คุณสามารถใส่ Configuration.ProxyCreationEnabled ไว้ในคลาสบัดดี้เพื่อไม่ให้ถูกเขียนทับ - person Mark Oreta; 15.10.2012

หากคุณใช้แนวทางที่เน้นโมเดลเป็นหลัก ซึ่งหมายความว่าคุณมีไฟล์ .edmx วิธีปิดใช้งานตัวเลือกนี้อย่างถาวรคือการแก้ไขไฟล์ .Context.tt ไฟล์นี้เป็นเทมเพลตการสร้างโค้ดที่กระบวนการบิลด์ใช้เพื่อสร้างคลาสที่ได้รับจาก DbContext

เปิดไฟล์นี้และค้นหาตัวสร้าง:

public <#=Code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
<#
        WriteLazyLoadingEnabled(container);
#>
        //add the following line of code

        this.Configuration.ProxyCreationEnabled = false;
    }

จากนั้นเพิ่มบรรทัดโค้ดเพื่อตั้งค่าคุณสมบัตินี้เป็นเท็จ สร้างโปรเจ็กต์ของคุณใหม่และตรวจสอบบริบทที่สร้างขึ้นว่ามีบรรทัด

person Scott Nelson    schedule 06.12.2012
comment
นี่คือคำตอบที่ถูกต้องในมุมมองของฉัน อย่างไรก็ตาม โปรดใช้ความระมัดระวัง หากอัปเกรด Entity Framework ในอนาคต เนื่องจากอาจเขียนทับการเปลี่ยนแปลงของคุณในไฟล์ .tt (ถ้าผมจำผิด?) - person rwalter; 11.11.2013
comment
สงสัยอยู่เสมอเกี่ยวกับเรื่องนั้น...ฉันชอบที่จะเห็นคำตอบที่ขยายคลาสบางส่วนที่สร้างขึ้นโดยใช้ DbContext (ซึ่งไม่ได้กำหนด OnContextCreated) - person seebiscuit; 06.05.2017