คำหลักเสมือนใดที่สามารถมีผลกระทบใน Entity Framework 4.1 POCO Code ก่อน


229

ไม่virtualคำหลักที่มีผลเมื่อใช้กับคุณสมบัติใน EF รหัสแรก ?. บางคนสามารถอธิบายการแยกย่อยของมันทั้งหมดในสถานการณ์ต่าง ๆ

ตัวอย่างเช่นฉันรู้ว่ามันสามารถควบคุมการโหลดที่ขี้เกียจ - ถ้าคุณใช้คำหลักเสมือนในคุณสมบัติความสัมพันธ์แบบ ICollection / ความสัมพันธ์แบบหนึ่งต่อหลายมันจะถูกโหลดแบบสันหลังยาวโดยค่าเริ่มต้นในขณะที่ถ้าคุณปล่อยให้คำหลักเสมือนออก กระฉับกระเฉง

virtualคำหลักอื่น ๆ ที่มีผลกับ EF ใน POCO คืออะไร? ฉันควรทำให้มันเป็นค่าเริ่มต้นที่จะใช้virtualกับคุณสมบัติทั้งหมดของฉันหรือเป็นค่าเริ่มต้นที่จะไม่ใช้มัน?

คำตอบ:


194

จนถึงตอนนี้ฉันรู้ถึงผลกระทบเหล่านี้

  • การโหลดขี้เกียจ : virtualICollections ใด ๆจะถูกโหลดแบบสันหลังยาวเว้นแต่คุณจะทำเครื่องหมายเป็นอย่างอื่นโดยเฉพาะ
  • การติดตามการเปลี่ยนแปลงที่มีประสิทธิภาพมากขึ้น หากคุณปฏิบัติตามข้อกำหนดต่อไปนี้แล้วการติดตามการเปลี่ยนแปลงของคุณสามารถใช้วิธีการที่มีประสิทธิภาพมากขึ้นโดยเชื่อมต่อคุณสมบัติเสมือนจริงของคุณ จากลิงค์:

    ในการรับการติดตามการเปลี่ยนแปลงพร็อกซีกฎพื้นฐานคือคลาสของคุณต้องเป็นแบบสาธารณะไม่ใช่แบบนามธรรมหรือแบบไม่ปิดผนึก คลาสของคุณจะต้องใช้ public getters / setters เสมือนสำหรับคุณสมบัติทั้งหมดที่ยืนยัน ในที่สุดคุณต้องประกาศคุณสมบัติการนำทางตามความสัมพันธ์ของคอลเลกชันเป็นICollection<T>เพียง พวกเขาไม่สามารถใช้งานได้อย่างเป็นรูปธรรมหรืออินเทอร์เฟซอื่นที่มาจากICollection<T>(ความแตกต่างจากพร็อกซีการโหลดรอตัดบัญชี)

อีกประการหนึ่งการเชื่อมโยงที่มีประโยชน์อธิบายนี้เป็น MSDN ของข้อกำหนดสำหรับการสร้าง POCO ผู้รับมอบฉันทะ


52
ไม่มีเหตุผลอื่นที่ทำให้คุณสมบัติเสมือนจริง คุณสมบัติการนำทางถูกทำเครื่องหมายเป็นเสมือนสำหรับการโหลดขี้เกียจและคุณสมบัติสเกลาร์ถูกทำเครื่องหมายเป็นเสมือนสำหรับการติดตามการเปลี่ยนแปลง
Ladislav Mrnka

10
คุณสมบัติการนำทางคืออะไรและคุณสมบัติสเกลาร์คืออะไร
Abid Ali

9
@AbidAli: ฉันเชื่อว่าคุณสมบัติการนำทางเป็นคีย์ต่างประเทศ (ประเภทคลาสเอนทิตี) หรือความสัมพันธ์แบบหนึ่งต่อหลาย (จากประเภท ICollection <>) คุณสมบัติเซนต์คิตส์และเนวิสเป็นประเภทฐาน (int, string, .. ) หรือ ComplexType (ซึ่งเป็นเพียงโครงสร้างของประเภทฐาน)
Scott Stafford

2
" public virtual byte[] bigData { get; set; }" กำลังโหลดขี้เกียจหรือไม่
AechoLiu

9
ไบต์ [] จะถูกโหลดอย่างกระตือรือร้นมีเพียงปุ่มต่างประเทศเท่านั้นที่สามารถขี้เกียจได้ หากคุณไม่ต้องการที่จะดึงข้อมูลคอลัมน์ที่ไม่เคยดึงข้อมูลบันทึกทั้งหมด - .Select(a=>new { fields you want })เพียงแค่
Scott Stafford

63

คำหลักเสมือนนี้เกี่ยวข้องกับหัวข้อของการโหลดข้อมูลจากเฟรมเวิร์กเอนทิตี (การโหลดแบบสันหลังยาว, การโหลดแบบกระตือรือร้นและการโหลดแบบชัดแจ้ง)

คุณควรใช้คำหลักเสมือนเมื่อคุณต้องการโหลดข้อมูลด้วยการโหลดแบบสันหลังยาว

lazy loadingเป็นกระบวนการที่เอนทิตีหรือชุดของเอนทิตีถูกโหลดจากฐานข้อมูลโดยอัตโนมัติในครั้งแรกที่มีการเข้าถึง

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

public class Blog 
{  
     public int BlogId { get; set; }  
     public string Name { get; set; }  
     public string Url { get; set; }  
     public string Tags { get; set; }  
     public virtual ICollection<Post> Posts { get; set; }  
}

การโหลด Lazy ของคอลเลกชันกระทู้สามารถปิดได้โดยทำให้คุณสมบัติการโพสต์ไม่ใช่แบบเสมือน

หากการโหลดแบบขี้เกียจปิดอยู่การโหลดคอลเลกชันโพสต์ยังสามารถทำได้โดยใช้การโหลดแบบกระตือรือร้น (โดยใช้วิธีการรวม) หรือการโหลดเอนทิตีที่เกี่ยวข้องอย่างชัดเจน (โดยใช้วิธีโหลด)

กำลังโหลดอย่างกระตือรือร้น:

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
                          .Include(b => b.Posts) 
                          .ToList(); 
}

โหลดอย่างชัดเจน:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Load the posts related to a given blog 
    context.Entry(blog).Collection(p => p.Posts).Load(); 
}

1
จะหลีกเลี่ยงปัญหา N + 1 เมื่อใช้งาน virtual (lazy-loading) ได้อย่างไร? ตัวอย่างเช่น context.Blogs.ToList (); จากนั้นจะไม่เข้าร่วมตารางและจะเรียกใช้แบบสอบถามแบบใช้เลือกข้อมูลเท่าจำนวนบล็อก
ผู้เชี่ยวชาญต้องการเป็น

1
@Expertwannabe Include()แม้ว่าคุณจะใช้ขี้เกียจโหลดคุณยังสามารถโหลดอย่างชัดเจนขอความกระตือรือร้นที่มีการเรียกร้องให้
พระคุณเจ้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.