Dereference ขออาจจะโพรโทคอล aimcomment อ้างอิงในรายการส่วนเฟรมเวิร์ก 6 query

0

คำถาม

ฉันมี.อข่ายนอก 6 โครงการกับ nullable อ้างอิงถึงประเภทเปิดใช้งาน(<Nullable>enable</Nullable>). ฉันต้อง EF รายการ:

public class PostFile {
  public Int32 UserId { get; set; }
  public Int32 PostId { get; set; }

  public virtual User? User { get; set; }
  public virtual Post? Post { get; set; }
}

ฉันเพิ่ม ? ด้านบนเพื่อป้องกันไม่ให้ nullable คำเตือน:

Non-nullable property '...' must contain a non-null value when exiting constructor. Consider declaring the property as nullable.

ตอนนี้,ฉันมีรายการส่วนเฟรมเวิร์ก 6 LINQ กับการค้นหา:

var postFiles = context.postFiles.Where(x => x.User.Id == request.UserId);

แต่ฉันทำตามคำเตือน:

Dereference of a possibly null reference.

...มันส่วนหนึ่งของฉันกับการค้นหา:

x.User.Id == ...

แล้วฉันจะแก้ตัวได้ยังเตือน?

4

คำตอบที่ดีที่สุด

2

ฉันคิดว่าคุณหมายถึงบางอย่างเหมือน:

public class PostFile {
    public Int32 UserId{ get; set; }
    public Int32 PostId { get; set; }

    public virtual User? User { get; set; }
    public virtual Post? Post { get; set; }
}

ของต้นฉบับปัญหาคือการเตือนนั่น C#8 อแนะนำให้รู้จักกับการเป็นมากก explicit กับโพรโทคอล aimcomment-สามารถอ้างอิงถึงชนิด สำหรับรายการที่อยู่เหนือ implementation ไม่ถูกต้ออกจากพวกนี้ความสัมพันธ์ของเราแน่นอตัวเลือกซึ่งคงจะต้องใช้พวกเขา FK ช่องข้อมูล(UserId และ PostId)ไปยังเป็นโพรโทคอล aimcomment-สามารถ. พวกเขาน่าจะเป็น ไม่ เลือกหรอกนะ

หลักตัวเลือกที่จะอยู่อย่างลำบากขนาดนั้น

เป็น)ปิดความสามารถของคุณสมบัติ. (ปิดการใช้งานโพรโทคอล aimcomment-สามารถอ้างอิงในหรับการออกแบบโครงการ)

บี)ถาม"การให้อภัยสำหรับความจริงที่ว่าพวกนี้ไม่ควรเป็นโพรโทคอล aimcomment แต่จะไม่อยู่ที่ถูกต้องรัฐในงานก่อสร้าง (EF จะจัดการพวกเขา)

public class PostFile {
    public Int32 UserId{ get; set; }
    public Int32 PostId { get; set; }

    public virtual User User { get; set; } = null!;
    public virtual Post Post { get; set; } = null!;
}

กระตุ้นบ้ารุ่นให้มาร์กแถบนำทาง comment คุณสมบัติของเป็นโพรโทคอล aimcomment-สามารถจะอ้างอิงไปยังแนวโน้มที่จะสาเหตุทุกประเภทของปัญหาเช่นเดียวกับ migrations มันสามารถและจะเริ่มหาคนมาแทนไม่ใช่โพรโทคอล aimcomment-สามารถ FKs กับโพรโทคอล aimcomment-สามารถรอกนะ เพื่อมาร์พวกนี้จะอ้างอิงไปยังเป็นโพรโทคอล aimcomment-สามารถและทำให้ EF มีความสุข:

public class PostFile {
    public Int32? UserId{ get; set; }
    public Int32? PostId { get; set; }

    public virtual User? User { get; set; }
    public virtual Post? Post { get; set; }
}

ซึ่งมันเกือบแน่นอนว่า ไม่ใช่ สิ่งที่คุณต้องการของโดเมนหรือแม้แต่ถูกกฏหมายถ้า UserId และ PostId เป็นส่วนหนึ่งของ PK.

เรื่องส่วนตัวฉัน chalking การเปลี่ยนแปลงครั้งใน C#เป็น"ดินแดนของฉัน"คุณเปิดใช้งานในตอนแรกโดยปริยายอย่างเช่นลูกค้าประเมินผลข้างใน EF. :) ขอบคุณครับท่านลอร์ดหลาย-a-StackOverflow คำถามอยู่นี่เตือนหรือแตกเปลี่ยนแปลงและมาเป็นลูกค้าของ codebases littered ด้วย"!"การให้อภัยป้ายกำกับตาแก่คนที่ไม่ใช่โพรโทคอล aimcomment-สามารถ™à§à±à•à-à/จะอ้างอิงไปยังเป็นผ่านเข้ารหัสกับโพรโทคอล aimcomment-สามารถอ้างอิงรตรวจสอบ

2021-11-24 23:15:24
1

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

อยู่กับการค้นหาของคุณแสดงคุณก็สามารถเป็นอย่างแน่นอนว่ารายการส่วนเฟรมเวิร์กจะไม่ประหารชีวิตพวกเขา clientside แต่การวิเคราะห์การร้องขอแบบ sql ออกจากพวกเขา

ดังนั้น:

.Where(x => x.User!.Id == request.UserId)

คุณสามารถบอกกับคอมไพเลอร์ User! นั่นคุณรู้ว่ามันจะไม่เป็นโพรโทคอล aimcomment ที่นั่น นอกจากคุณเปิดใช้งาน clientside ประเมินผลแต่คุณไม่ควรแล้วและถ้าคุณทำ,คุณจะต้องโพรโทคอล aimcomment ดูมีอยู่แล้ว

สำหรับการใช้พื้นทีี่ของ PostFile.Userอย่างที่อยู่:

var postFile = dbContext.PostFiles.FirstOrDefault(p => p....) ?? throw ...;
var user = postFile.User;

นั่นมันจะเป็น null ถ้าคุณไม่ได้ Include(p => p.User) และไม่มีจอมขี้เกียจกำลังโหลดกเปิดใช้ตัวเลือกแล้ว user คงต้องการเป็นโพรโทคอล aimcomment องเช็คก่อนที่การใช้.

ถ้าคุณ ทำอย่าง ใช้คนขี้เกียจการโหลด,คุณสามารถปิดการทำงานของคำเตือน:

#pragma warning disable CS8618 // EF initializes these properties through lazy loading
    public virtual User User { get; set; }
#pragma warning restore CS8618 
2021-11-24 22:37:30
0

ฉันคิดว่าคุณต้องการองนี้:

public class PostFile {
    public User User { get; set; }
    public Post Post { get; set; }
}

แล้วโทรหา

var postFiles = context.postFiles.Where(x => x.User.Id == request.UserId).Include(x => x.Post);
2021-11-24 22:52:47

ไม่นะ ไม่ใช่สัญลักษณ์นั้นพวกนี้คุณสมบัติของเป็น nullable ทำให้คอมไพเลอร์ส่งเสีการแจ้งเตือนว่าพวกเขาอาจจะไม่สามารถใช้ถอดซึ่งเป็นเรื่องจริง
CodeCaster
0

แล้ว var postFiles = context.postFiles.Where(x => x.User != null && x.User.Id == request.UserId);?

2021-11-24 22:53:01

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่