ไมโครซอฟท์EntityFrameworkCore.DbUpdateConcurrencyException:ฐานข้อมูลของปฏิบัติการคาดหวังที่จะส่งผลต่อ 1 แถว(s)แต่จริงๆแล้วส่งผลกระทบกับ 2 แถว(s)

0

คำถาม

ฉันได้รับข้อผิดพลาดนี้เมื่อฉันพยายามที่จะปรับปรุงโต๊ะเดียวกันค่า(carNumber),สภาพของฉันคือการปรับปรุงที่แท้จริงกลับมาวันสอนคือโพรโทคอล aimcomment.

สำหรับเหตุผลบางอย่างมันดูเหมือนกับการค้นหาอบแทน 2 แถวแต่ที่จริงมีเพียงคนเดียว ฉันกำลังใช้ EF. นี่คือการตรวจสอบสิทธิ์

ข้อผิดพลาด-การพิมพ์หน้าจอ

   public void updateStatus(int carNumber1, string acctualDate1)
    {
        DateTime accReturn = DateTime.Parse(acctualDate1);

        var orderCar1 =  db.CarRentalFields.FirstOrDefault(carNum =>
        (carNum.CarNumber == carNumber1 && carNum.ActualReturnDate == null));

            orderCar1.ActualReturnDate = accReturn  ;
             
                db.SaveChanges();

ข้อผิดพลาดขึ้นเมื่อพยายาม db.saveChanges()

โต๊ะจาก db รถจำเป็น 1000-การพิมพ์หน้าจอ

modelBuilder.รายการ pic

ได้โปรดให้ฉันรู้วิธีให้ฉันแก้ปัญหานี้เหมือนไม่มีปัญหาอยู่เลยสินะ

c# entity-framework linq sql-server
2021-11-23 20:34:34
2
0

ปัญหาแก้ไขได้โดยเพิ่มเป็นคอลัมน์แสดงผล view->ที่ car_rental_fields โต๊ะคอลัมน์หมายเลขนั่นรวมตัวตน อย่างที่ฉันเข้าใจจากที่นี่และออกจากเว็บมีปัญหากับมันซับซ้อ pk. ในวิธีแก้ปัญหาของฉันที่หมายเลขไม่ใช่นกลุ่มหลักกุญแจแต่มันทำให้คนตรรกะสำหรับ linq ต้องปรับปรุงที่ถูกต้องคอลัมน์ ขอบคุณสำหรับทุกคนที่เกี่ยวข้องในนี้เหมือนไม่มีปัญหาอยู่เลยสินะ

2021-11-26 20:37:27
0

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

  • เป็น EDMX
  • ใน DbContext.OnModelCreating
  • การใช้ EntityTypeConfiguration ปล่อยให้เธอได้หายใจอยู่อี
  • ใช้แอททริบิวต์ต่างๆภายในรายการตัวมันเอง

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

คุณอาจจะมีบางอย่างเหมือน:

public class CarRentalFields
{
    [Column("start_day")]
    public DateTime StartDay { get; set; }
    [Column("return_date")]
    public DateTime ReturnDate { get; set; }
    [Column("user_id")]
    public int UserId { get; set; }
    [Column("car_number")]
    public DateTime CarNumber { get; set; }
    
    // ... more columns...
}

คุณอาจจะต้องเป็น [Key] แอททริบิวต์ในหนึ่งของพวกนี้ช่องข้อมูลอย่างเช่น CarNumber. ถ้ามี PK งแผนไว้ในรายการประเด็นคือมันไม่ได้เจาะจงมากพอที่จะระบุได้ว่าแถวด้วย ตอนที่ EF ไปปรับปรุงหนึ่งรายการมันคือกำลังตรวจสอบและหวังจะปรับปรุงเดียวแถวอยู่ในโต๊ะ มันเป็นการตามหามากกว่าหนึ่งแถวจะส่งผลกระทบกับดังนั้นมันจะล้มเหลว

เพิ่มคุณลักษณะสำหรับ [Key] กับคอลัมน์เพื่อมันเป็นอย่างนั้นจำเป็นองดูองค์ประกอบกุญแจ

public class CarRentalFields
{
    [Key, Column(Name="start_day", Order=1)]
    public DateTime StartDay { get; set; }
    [Key, Column(Name="return_date", Order=2)]
    public DateTime ReturnDate { get; set; }
    [Key, Column(Name="user_id", Order=3)]
    public int UserId { get; set; }
    [Key, Column(Name="car_number", Order=4)]
    public DateTime CarNumber { get; set; }
    
    // ... more columns...
}

เตรียมไว้ให้พวก 4 คอลัมน์เป็นแน่นอนที่สุดที่จะเป็นยูนิค constraint วางอยู่บนโต๊ะ EF จะเป็นพอใจตอนที่เดียวแถวคืออัพเดทตอนที่มันสร้างมันปรับปรุงภาษา sql ขโยงข้างนอกนั่น

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

ปรับปรุง: ของผู้ต้องสงสัยอันดับหนึ่งในนี้จะเป็นมันที่โต๊ะมันไม่มีตรงกับ PK กำหนดไว้เหมือนกักำลังต่างออก PK รรวมเข้าด้วยกันหรืออะไรสักอไม่ PK จากธรรมชาติของพวกนั้นฟิลด์ EF สามารถทำการผ่าตัดตารางข้อมูลเรียบร้อยแล้วนั่นไม่มี PK กำหนดไว้แต่มันต้องใช้กุญแจมายความว่านั่น ensures บันทึกได้เป็นความรู้สึกเฉพาะแสดงตัว ข้อผิดพลาดคุณได้เห็นจะเกิดขึ้นเมื่อกุญแจมายความว่าไม่ใช่ยูนีคพอแล้ว (มือนกัน e. ถ้าคุณกำลังปรับปรุงรถ 1 และการเลือกแถวที่มี: car_number=1,start_day=2021-11-21,return_day=2021-11-22,user_id=0 ปัญหานั่นมากกว่าหนึ่งแถวไม่ต้องหรอกมันก็เป็นการผสมผใน DB. ถ้า DB คุณเป็นเช็คไม่ได้มีมากกว่าหนึ่งตรงกับแถวนั้นโปรแกรมของคุณคือเกือบแน่นอนชี้ไปที่อีกฐานข้อมูลมากกว่าคุณกำลังเช็กอยู่

สิ่งที่คุณสามารถทำได้เพื่อตรวจสอบนี้:

  1. เอา runtime การเชื่อมต่อข้อความแล้วดูว่ามันตรงกับ DB คุณตรวจ:

ก่อนที่คุณวิ่งหนีของคุณกับการค้นหาเพิ่มต่อไปนี้:

// EF6
var connectionString = db.Database.Connection.ConnectionString;
// EF Core 5
var connectionString = db.Database.GetConnectionString();
  1. ดูที่ข้อมูลของคุณจริงๆ querying:

.

var cars =  db.CarRentalFields.Where(carNum =>
    (carNum.CarNumber == carNumber1 && carNum.ActualReturnDate == null)).ToList();

ตอนนี้ query อาจจะกลับมาเพียง 1 บันทึกนั่นไม่ใช่สาเหตุของปัญหา สิ่งที่คุณต้องการคือ CarNumber,StartDate,ReturnDate และ UserId เรื่องนี้บันทึก:

var car =  db.CarRentalFields
    .Where(carNum => carNum.CarNumber == carNumber1 
        && carNum.ActualReturnDate == null)
    .Select(x => new 
    {
        x.CarNumber,
        x.StartDay,
        x.ReturnDate,
        x.UserId
    }).Single(); // Expect our 1 record here...
var cars = db.CarRentalFields
    .Where(x => x.CarNumber == car.CarNumber
        && x.StartDay == car.StartDay
        && x.ReturnDate == car.ReturnDate
        && x.UserId == car.UserId)
    .ToList(); // Get rows that match our returned Key fields.

พวกนี้ค้นข้อมูลที่เลือกคิดว่า PK อนค่าสำหรับรถบันทึกคุณหมายถึงต้องปรับปรุงแล้วค้นหารถยนต์สำหรับตรงกับประวัติกับที่คาดหวังกุญแจฟิลด์ เงินของฉันจะอยู่บนระบบการค้นหาจะได้ค่า 1 ประวัติทางด้านล่างกับการค้นหาจะได้ค่าสองคนแถว,หมายความว่าขณะเดียวที่ 1 บันทึกมี#โพรโทคอล aimcomment ActualReturnDate ค่าของคุณสำคัญคือไม่ได้พิเศษพอสำหรับเนื้อหาของโต๊ะนี้

2021-11-26 22:57:48

ฉันกำลังใช้ contex คุณเห็นของฉันตีพิมพ์หน้าจอของนางแบบสร้าง?
elirans

ใช่โอเคนั่นมันใช้ DbContext น OnModelCreating modelBuilder ดังนั้นกุญแจสำคัญคือการได้ถูกกำหนดไว้ สิ่งต่อไปเช็คงจะไม่ว่าพวกนั้นคอลัมน์ตรงกับ PK/ยูนิค w constraint อยู่ของคุณที่ตรงฐานข้อมูล ถ้าไม่ใช่กุญแจนั่นอาจจะต้องการจะขยาย. ดูองค์ประกอบกุญแจควรจะเลี่ยงไม่ให้มากที่สุดเท่าที่จะทำได้อย่างที่พวกเขาทำการตั้งค่าขึ้นมาความสัมพันธ์มากขึ้น คุณยังสามารถใช้เป็นวิเคราะห์พฤติกรรมเพื่อช่วยจับคนขอเธอแต่งงานปรับปรุงคำให้การนั้นแปลงมันเข้าอย่างง่ายเลือกที่จะเห็นอะไรแถวเป็นกลับมาแล้ว สำหรับเหตุผลบางอย่างมากกว่าหนึ่งแถวเป็นกำลังจะกลับมา
Steve Py

เป็นอีกเรื่องที่จะตรวจสอคือว่าตอน runtime โปรแกรมหวังว่าจะไม่มีอะไรผิดพเดียวกับฐานข้อมูลเป็นสิ่งที่คุณกำลังเช็กอยู่ ข้อมูลคุณกำลังเช็คอาจจะปรากฎพิเศษเพียงพอถ้า DB ไม่ใช่ผู้คุมกฎเฉพาะตัวและงานเพียงอย่างเดี constraint พวกนั้นคอลัมน์แต่งฐานข้อมูลการเล็งไปที่ runtime มีที่ซ้ำกันออกแถว.
Steve Py

เดียวกันเกิดข้อผิดพลาดเกิดขึ้นโดยใช้ทางแก้ของคุณฉันต้องเปลี่ยนแปลงของฉันฟังก์ชันยัง? @สตีฟ Py
elirans

จับภาษา sql ถูกสร้างแล้วหนีจากฐานข้อมูลเหมือนกัน ฉันจะใช้วิเคราะห์พฤติกรรมสำหรับเรื่องนี้ดังนั้นสำหรับภาษา sql เซิร์ฟเวอร์และ SSMS ภายใต้เครื่องมือ\ภาษา sql วิเคราะห์พฤติกรรม. วิ่งไปต่อต้านของคุณ DB แล้วประมวลผลของคุณกับการค้นหา. คุณสามารถใช้เป็นจุดหยุดในโปรแกรมของคุณก่อนที่ SaveChanges งั้นก็ชัดเจนนักวิเคราะห์พฤติกรรแสดงผลก่อนที่ resuming ทำความสะอาดออกก่อนหน้าเสียงและค้นหาของคุณปรับปรุงรายงานส่งด้วย
Steve Py

ก็คุณสามารถตั้งโต๊ะดีไซเนอร์ส่งออกสำหรับโต๊ะของคุณ? มันที่โต๊ะต้องการจริงๆ PK ตั้งค่าเหล่านั้น 4 คอลัมน์?
Steve Py

ฉันเพิ่มเข้ากับคำตอบอยู่เหนือไปรวมขั้นตอนที่โปรดตรวจสอบการเชื่อมต่อข้อความเช่นเดียวตรวจสอบอยู่ในข้อมูลไม่ว่ายังมีที่ซ้ำกันออกกุญแจค่า.
Steve Py

ฉันพยายามของคุณคิดอะไรบางอย่างออก สิ่งแรกที่มันดูเหมือนคุณคิดถึงบาง'='อยู่ในรถ variance. สอง-ตอนที่ฉันพยายามจะทำให้ปรับปรุง:รถยนต์ActualReturnDate=acctualDate1 ฉันได้ข้อผิดพลาดเกิดขึ้นระหว่าง cs1061.
elirans

ในภาษาอื่นๆ

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

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

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

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