ข้อผิดพลาดนี้เกิดขึ้นตอนที่ 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 คุณเป็นเช็คไม่ได้มีมากกว่าหนึ่งตรงกับแถวนั้นโปรแกรมของคุณคือเกือบแน่นอนชี้ไปที่อีกฐานข้อมูลมากกว่าคุณกำลังเช็กอยู่
สิ่งที่คุณสามารถทำได้เพื่อตรวจสอบนี้:
- เอา runtime การเชื่อมต่อข้อความแล้วดูว่ามันตรงกับ DB คุณตรวจ:
ก่อนที่คุณวิ่งหนีของคุณกับการค้นหาเพิ่มต่อไปนี้:
// EF6
var connectionString = db.Database.Connection.ConnectionString;
// EF Core 5
var connectionString = db.Database.GetConnectionString();
- ดูที่ข้อมูลของคุณจริงๆ 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 ค่าของคุณสำคัญคือไม่ได้พิเศษพอสำหรับเนื้อหาของโต๊ะนี้