Entity Framework: ตารางที่ไม่มีคีย์หลัก


165

ฉันมีฐานข้อมูลที่มีอยู่ซึ่งฉันต้องการสร้างแอปใหม่โดยใช้ EF4.0

บางตารางไม่มีคีย์หลักที่กำหนดไว้ดังนั้นเมื่อฉันสร้างรูปแบบข้อมูลเอนทิตีใหม่ฉันได้รับข้อความต่อไปนี้:

The table/view TABLE_NAME does not have a primary key defined 
and no valid primary key could be inferred. This table/view has 
been excluded. To use the entity, you will need to review your schema, 
add the correct keys, and uncomment it.

หากฉันต้องการใช้และแก้ไขข้อมูลฉันต้องเพิ่ม PK ลงในตารางเหล่านั้นหรือต้องมีวิธีแก้ปัญหาเพื่อที่ฉันจะได้ไม่ต้อง?


21
ที่จะพูดโจเซลโก: ถ้ามันไม่ได้มีคีย์หลักก็ไม่ได้ตาราง ทำไมในโลกทุกคนจะสร้างตาราง "ปกติ" โดยไม่มีคีย์หลัก? เพียงเพิ่ม PK เหล่านั้น! คุณจะต้องการพวกเขา - ค่อนข้างเร็วกว่าในภายหลัง ....
marc_s

4
ถ้ามันดู hava นี้ดูกรณีนี้stackoverflow.com/a/10302066/413032
Davut Gürbüz

50
ใช้ได้อย่างสมบูรณ์แบบว่าไม่ใช่ทุกตารางที่ต้องการคีย์หลัก ไม่ค่อยมีประโยชน์ แต่ใช้ได้จริง ความสับสนของ EF เป็นหนึ่งในเหตุผลที่ดีไม่ใช่ว่าจะใช้เวลามาก ;-)
Suncat2000

25
ลองนึกภาพว่าฉันไม่สามารถปรับเปลี่ยนโครงสร้างฐานข้อมูลบน บริษัท ของฉันและมันถูกสร้างขึ้นโดยใครบางคนที่ไม่เปลี่ยนโครงสร้างตารางสถานการณ์นี้เป็นไปได้
ตีโต้

4
ตรงนี้เป็นที่ที่เราอยู่ เราต้องทำงานกับฐานข้อมูล Oracle บุคคลที่สามที่ไม่มีคีย์หลัก
David Brower

คำตอบ:


58

ข้อผิดพลาดหมายถึงสิ่งที่มันบอกว่า

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

อย่าแก้ไขสิ่งนี้ แก้ไขโมเดลข้อมูลของคุณ

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

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


44
เห็นด้วยในเซเนกัลทั่วไป แต่ในเซเนกัลที่หายากเช่นตาราง LOG คุณเพียงแค่ต้องแทรกเรคคอร์ดโดยเร็ว การมีเภสัชจลนศาสตร์อาจเป็นปัญหาเมื่อตรวจสอบเอกลักษณ์และการจัดทำดัชนีเกิดขึ้น นอกจากนี้ถ้า PK ของคุณเป็นตัวตนดังนั้นการส่งคืนค่าที่สร้างขึ้นให้กับ EF ก็เป็นอีกปัญหาหนึ่ง ใช้ GUID แทนไหม เวลาในการสร้างและการจัดทำดัชนี / การเรียงลำดับเป็นอีกปัญหาหนึ่ง! ... ดังนั้นในรุ่นพี่ที่สำคัญของ OLTP (เช่นการบันทึก) ที่ไม่มี PK เป็นจุดและการมีจุดบวกไม่ได้!
Mahmoud Moravej

5
@MahmoudMoravej: ก่อนอื่นอย่าสับสนแนวคิดของการจัดกลุ่มดัชนีและคีย์หลัก พวกเขาไม่เหมือนกัน คุณสามารถแทรกเม็ดมีดที่มีประสิทธิภาพสูงมากในตารางที่มีตัวบ่งชี้คลัสเตอร์ในคอลัมน์ IDENTITY หากคุณพบปัญหาเกี่ยวกับการบำรุงรักษาดัชนีคุณควรแบ่งพาร์ติชันตารางอย่างเหมาะสม การออกจากตารางที่ไม่มีดัชนีคลัสเตอร์ยังหมายความว่าคุณไม่สามารถจัดเรียงข้อมูลอย่างมีประสิทธิภาพเพื่อเรียกคืนพื้นที่หลังจากลบ ฉันสงสารคนจนที่พยายามสืบค้นตารางการบันทึกของคุณหากไม่มีดัชนี
Dave Markle

149
"แก้ไขโมเดลข้อมูลของคุณ" ไม่ใช่คำตอบที่แท้จริง บางครั้งเราต้องอยู่กับสถานการณ์ที่ไม่เหมาะเราไม่ได้สร้างและไม่สามารถเปลี่ยนแปลงได้ และตามที่ @Colin พูดมีวิธีที่จะทำสิ่งที่ OP ต้องการ
TheSmurf

13
การเปลี่ยนรหัสเพื่อให้เป็นไปตามความพึงพอใจของ EF เป็นวิธีแก้ปัญหาในตัว ไม่ใช่ทุกโต๊ะที่ต้องการคีย์หลักและไม่ควรถูกบังคับ เช่นคุณมีหัวข้อและมี 0 หรือคำหลักจำนวนมาก ตารางคำหลักสามารถมีรหัสหัวข้อหลักและคำหลักที่เกี่ยวข้อง หากต้องการบอกว่าฉันต้องปรับรูปแบบฐานข้อมูลของฉันเพราะ EF บังคับให้ฉันเป็นคนอ่อนแอ
Mrchief

14
ควรลดระดับลงเนื่องจากไม่ตอบคำถาม เรามักจะต้องทำงานกับฐานข้อมูลบุคคลที่สามที่ไม่สามารถเปลี่ยนแปลงได้
Kurren

104

ฉันคิดว่านี่แก้ไขได้โดย Tillito:

Entity Framework และมุมมองเซิร์ฟเวอร์ SQL

ฉันจะอ้างอิงข้อความของเขาด้านล่าง:

เรามีปัญหาเดียวกันและนี่คือทางออก:

เมื่อต้องการบังคับให้เฟรมเวิร์กเอนทิตีใช้คอลัมน์เป็นคีย์หลักให้ใช้ ISNULL

เพื่อบังคับให้เฟรมเวิร์กเอนทิตีไม่ใช้คอลัมน์เป็นคีย์หลักให้ใช้ NULLIF

วิธีที่ง่ายในการใช้สิ่งนี้คือการตัดคำสั่ง select ของมุมมองของคุณในตัวเลือกอื่น

ตัวอย่าง:

SELECT
  ISNULL(MyPrimaryID,-999) MyPrimaryID,
  NULLIF(AnotherProperty,'') AnotherProperty
  FROM ( ... ) AS temp

ตอบ 26 เม.ย. 53 เวลา 17:00 น. โดย Tillito


6
+1 นี่คือคำตอบที่ถูกต้องในโลกที่สมบูรณ์แบบมันจะเป็นการดีที่จะเข้าไปและแก้ไขฐานข้อมูลดั้งเดิมทั้งหมดเพื่อให้มี Referential Integrity แต่ในความเป็นจริงมันไม่สามารถทำได้
Dylan Hayes

9
ฉันจะไม่แนะนำสิ่งนี้ โดยเฉพาะอย่างยิ่งส่วน ISNULL หาก EF ตรวจพบสอง PKs เดียวกันมันอาจไม่แสดงเร็กคอร์ดที่ไม่ซ้ำกันและส่งคืนออบเจ็กต์ที่ใช้ร่วมกันแทน เรื่องนี้เกิดขึ้นกับฉันก่อน
ทอดด์

@Todd - จะเกิดอะไรขึ้นหาก MyPrimaryID ไม่ใช่คอลัมน์ NULL
JoeCool

@ JoeCool เพียงเพราะไม่ใช่ค่า NULL ไม่ได้หมายความว่าจะไม่ซ้ำกัน ฉันยกระดับ "โซลูชันนี้ใช้งานได้ ... " เพราะไม่ว่าจะใช้บริบทแบบใดคุณจึงมั่นใจได้ว่ามีเอกลักษณ์ แม้ว่าจะคิดอยู่ตอนนี้หากบันทึกถูกลบซึ่งจะเปลี่ยนระเบียน "PK" ต่อไปนี้ได้อย่างมีประสิทธิภาพ
ทอดด์

1
-1 เนื่องจากสิ่งนี้ไม่ได้ตอบวิธีกำหนดค่าเอนทิตี Framework / C # เพื่อจัดการกับวิธีแมปกับตารางที่ไม่มีเมล็ดข้อมูลเฉพาะตัว ซอฟต์แวร์ของบุคคลที่สามบางตัว (ด้วยเหตุผลบางอย่าง) เขียนด้วยวิธีนี้
Andrew Grey

27

หากฉันต้องการใช้และแก้ไขข้อมูลฉันต้องเพิ่ม PK ลงในตารางเหล่านั้นหรือต้องมีวิธีแก้ปัญหาเพื่อที่ฉันจะได้ไม่ต้อง?

สำหรับผู้ที่มาถึงคำถามนี้และกำลังใช้งาน Entity Framework Core คุณไม่จำเป็นต้องเพิ่ม PK ลงในตารางที่กำหนดหรือทำวิธีแก้ปัญหาใด ๆ อีกต่อไป เนื่องจาก EF Core 2.1 เรามีคุณลักษณะการสืบค้นใหม่

ต้องใช้ประเภทการค้นหาสำหรับ:

  • ทำหน้าที่เป็นชนิดส่งคืนสำหรับแบบสอบถาม ad hoc FromSql ()
  • การแม็พกับมุมมองฐานข้อมูล
  • การแม็พกับตารางที่ไม่มีคีย์หลักที่กำหนดไว้
  • การแม็พกับเคียวรีที่กำหนดในโมเดล

ดังนั้นใน DbContext ของคุณเพียงเพิ่มคุณสมบัติประเภทต่อไปนี้DbQuery<T>แทนDbSet<T>แบบด้านล่าง สมมติว่าชื่อตารางของคุณคือMyTable:

public DbQuery<MyTable> MyTables { get; set; }

1
คำตอบที่ดีที่สุดถ้าคุณใช้ EF Core!
Jay

17

คีย์คอมโพสิตสามารถทำได้ด้วย Entity Framework Fluent API

public class MyModelConfiguration : EntityTypeConfiguration<MyModel>
{
     public MyModelConfiguration()
     {
        ToTable("MY_MODEL_TABLE");
        HasKey(x => new { x.SourceId, x.StartDate, x.EndDate, x.GmsDate });
        ...
     }
}

ในกรณีของ 'การแมปด้วยตนเอง' นี้ฉันพบว่าการระบุคีย์ที่กำหนดเองตามที่คุณแสดงนั้นมีประสิทธิภาพ นอกจากนี้หากคุณไม่ได้รับประโยชน์จากคีย์ผสม (ดังที่แสดงในคำตอบนี้) คุณสามารถติดแท็กmodelBuilder.Entity<T>()สายโซ่ด้วย.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)คีย์ Oh-so-special เหล่านั้นที่ไม่ได้เป็นธรรมชาติหรือคอมโพสิต แต่สามารถเป็นที่พึ่งได้ เพื่อที่จะไม่ซ้ำกัน (ปกติแล้วต่อไป)
แอนดรูเกรย์

5

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

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[StringLength(255)]
public string UserSID { get; set; }

โกง EF ทำงานอย่างสมบูรณ์แบบไม่มีใครสังเกตเห็น ... :)


ไม่ .. มันจะสร้างUserIDคอลัมน์ถ้าคุณใช้วิธีการแบบรหัสแรก .. !
Deepak Sharma

1
คุณไม่ได้โกง EF คุณเพิ่งได้รับคำสั่งให้ปิดItentityฟังก์ชั่น โดยทั่วไปถ้าฉันถูกต้องมันจะยังคงสร้างUserIDคอลัมน์สำหรับคุณในฐานะ PK แต่จะไม่เพิ่มขึ้นโดยอัตโนมัติUserIDเมื่อคุณสร้างระเบียนใหม่ตามค่าเริ่มต้น UserIDนอกจากนี้คุณยังคงต้องการที่จะเก็บค่าที่แตกต่างกันใน
เฒ่า

1
@Celdor UserSID เป็นสตริงมันจะไม่ได้รับ "เพิ่มขึ้นอัตโนมัติ" ถ้าเป็นคอลัมน์ข้อมูลจำนวนเต็มฐานข้อมูลจะเพิ่มขึ้นในส่วนแทรกไม่ใช่ Entity Framework
reggaeguitar

4

EF ไม่ต้องการคีย์หลักในฐานข้อมูล ถ้าเป็นเช่นนั้นคุณจะไม่สามารถผูกเอนทิตีกับมุมมองได้

คุณสามารถแก้ไข SSDL (และ CSDL) เพื่อระบุฟิลด์ที่ไม่ซ้ำกันเป็นคีย์หลักของคุณ หากคุณไม่มีฟิลด์ที่ไม่ซ้ำกันฉันเชื่อว่าคุณถูก hosed แต่คุณควรมีเขตข้อมูลที่ไม่ซ้ำกัน (และ PK) มิฉะนั้นคุณจะพบปัญหาในภายหลัง

เอริค


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

3

การมีรหัสประจำตัวที่ไร้ประโยชน์นั้นไม่มีประโยชน์ในบางครั้ง ฉันพบว่ารหัสไม่ได้ใช้ทำไมเพิ่มมัน? อย่างไรก็ตามเอนทิตีไม่ได้ให้อภัยดังนั้นการเพิ่มฟิลด์ ID จะเป็นการดีที่สุด แม้ในกรณีที่ไม่ได้ใช้จะดีกว่าการจัดการกับข้อผิดพลาดที่ไม่หยุดหย่อนของ Entity เกี่ยวกับรหัสประจำตัวที่หายไป


3

โซลูชันนี้ทำงาน

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

ในการทำเช่นนี้คุณสามารถเพิ่มหมายเลขแถวในมุมมองของคุณด้วยฟังก์ชัน isNull ดังนี้

select 
    ISNULL(ROW_NUMBER() OVER (ORDER BY xxx), - 9999) AS id
from a

ISNULL(id, number) เป็นจุดสำคัญที่นี่เพราะมันบอก EF ว่าคอลัมน์นี้อาจเป็นคีย์หลัก


2
ฉันจะไม่แนะนำส่วน ISNULL ถ้า EF ตรวจพบสอง PKs เหมือนกันมันอาจไม่แสดงเร็กคอร์ดที่ไม่ซ้ำกันและส่งคืนออบเจ็กต์ที่ใช้ร่วมกันแทน เรื่องนี้เกิดขึ้นกับฉันก่อน
ทอดด์

1
คุณต้องใช้ isnull มิฉะนั้น EF จะไม่เชื่อว่าไม่เป็นโมฆะ
Archlight

2

คำตอบข้างต้นนั้นถูกต้องหากคุณไม่มี PK จริงๆ

แต่ถ้ามีเพียงอันเดียว แต่ไม่ได้ระบุไว้กับดัชนีใน DB และคุณไม่สามารถเปลี่ยน DB ได้ (ใช่ฉันทำงานในโลกของ Dilbert) คุณสามารถแมปฟิลด์ด้วยตนเองเป็นกุญแจสำคัญได้


2

นี่เป็นเพียงส่วนเพิ่มเติมจากคำตอบของ @Erick T หากไม่มีคอลัมน์เดียวที่มีค่าที่ไม่ซ้ำการแก้ปัญหาคือการใช้คีย์ผสมดังต่อไปนี้:

[Key]
[Column("LAST_NAME", Order = 1)]
public string LastName { get; set; }

[Key]
[Column("FIRST_NAME", Order = 2)]
public string FirstName { get; set; }

นี่เป็นเพียงวิธีแก้ปัญหา ทางออกที่แท้จริงคือการแก้ไขรูปแบบข้อมูล


2

อาจจะตอบช้า ...

หากตารางไม่มีคีย์หลักแสดงว่ามีบางสถานการณ์ที่ต้องวิเคราะห์เพื่อให้ EF ทำงานได้อย่างถูกต้อง กฎคือ: EF จะทำงานกับตาราง / คลาสที่มีคีย์หลัก นั่นคือวิธีการติดตาม ...

บอกเด็ก ๆ ว่าตารางของคุณ 1. บันทึกไม่ซ้ำกัน: ความเป็นเอกลักษณ์ทำโดยคอลัมน์คีย์ต่างประเทศเดียว: 2. บันทึกนั้นไม่ซ้ำกัน: มีการสร้างเอกลักษณ์โดยการรวมหลายคอลัมน์เข้าด้วยกัน 3. บันทึกไม่ซ้ำกัน (ส่วนใหญ่ *)

สำหรับสถานการณ์ # 1 และ # 2 คุณสามารถเพิ่มบรรทัดต่อไปนี้ลงในโมดูล DbContext OnModelCreating วิธี: modelBuilder.Entity () HasKey (x => ใหม่ {x.column_a, x.column_b}); // คอลัมน์มากเท่าที่จะทำให้ระเบียนไม่ซ้ำกัน

สำหรับสถานการณ์ # 3 คุณยังคงสามารถใช้วิธีแก้ไขปัญหาข้างต้น (# 1 + # 2) หลังจากที่คุณศึกษาตาราง (* สิ่งที่ทำให้ระเบียนทั้งหมดไม่ซ้ำกันอยู่แล้ว) หากคุณต้องมีคอลัมน์ทั้งหมดเพื่อสร้างระเบียนทั้งหมดที่ไม่ซ้ำกันคุณอาจต้องการเพิ่มคอลัมน์คีย์หลักในตารางของคุณ หากตารางนี้มาจากผู้ขายที่เป็นบุคคลที่สามมากกว่าการโคลนตารางนี้ไปยังฐานข้อมูลท้องถิ่นของคุณ (ค้างคืนหรือหลายครั้งที่คุณต้องการ) ด้วยการเพิ่มคอลัมน์คีย์หลักโดยพลการผ่านสคริปต์โคลนของคุณ


1
  1. เปลี่ยนโครงสร้างตารางและเพิ่มคอลัมน์หลัก อัปเดตโมเดล
  2. แก้ไขไฟล์. EDMX ในตัวแก้ไข XML และลองเพิ่มคอลัมน์ใหม่ภายใต้แท็กสำหรับตารางนี้โดยเฉพาะ (จะไม่ทำงาน)
  3. แทนที่จะสร้างคอลัมน์หลักใหม่เพื่อออกจากตารางฉันจะสร้างคีย์ผสมโดยเกี่ยวข้องกับคอลัมน์ที่มีอยู่ทั้งหมด ( ทำงาน )

Entity Framework: การเพิ่ม DataTable โดยไม่มีคีย์หลักให้กับ Entity Model


ฉันลองใช้วิธีผสมคีย์กับ EF 4.0 และมันไม่ทำงาน
Ralph Willgoss

วิธีการนี้ใช้งานได้อย่างสมบูรณ์แบบสำหรับฉันอาจเป็นความเจ็บปวดในการทำงานกับระบบเดิม "บางครั้ง" ...
pinmonkeyiii

1

อัปเดตเป็นคำตอบของ@CodeNotFound

ใน EF Core 3.0 DbQuery<T>เลิกใช้แล้วคุณควรใช้ประเภทเอนทิตี Keylessซึ่งควรจะทำสิ่งเดียวกัน สิ่งเหล่านี้ถูกกำหนดค่าด้วยHasNoKey()วิธีModelBuilder ในคลาส DbContext ของคุณทำสิ่งนี้

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<YourEntityType>(eb =>
        {
            eb.HasNoKey();
        });

}

มีข้อ จำกัด แม้ว่าสะดุดตา:

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

ซึ่งหมายความว่าสำหรับคำถามของ

หากฉันต้องการใช้และแก้ไขข้อมูลฉันต้องเพิ่ม PK ลงในตารางเหล่านั้นหรือต้องมีวิธีแก้ปัญหาเพื่อที่ฉันจะได้ไม่ต้อง?

คุณไม่สามารถแก้ไขข้อมูลด้วยวิธีนี้ - แต่คุณสามารถอ่านได้ เราสามารถจินตนาการโดยใช้วิธีอื่น (เช่น ADO.NET, Dapper) เพื่อแก้ไขข้อมูลซึ่งอาจเป็นวิธีแก้ปัญหาในกรณีที่คุณไม่จำเป็นต้องดำเนินการที่ไม่ได้อ่านและยังต้องการใช้ EF Core สำหรับกรณีส่วนใหญ่ของคุณ

นอกจากนี้หากคุณต้องการ / ต้องการทำงานกับตารางฮีป (keyless) อย่างแท้จริงให้ลองใช้ EF และใช้วิธีอื่นในการพูดคุยกับฐานข้อมูลของคุณ


0

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

หากไม่มีคีย์ที่ไม่ซ้ำใครระเบียนที่ซ้ำกันสามารถ (และจะ) ปรากฏในตารางซึ่งเป็นปัญหาอย่างมากสำหรับเลเยอร์ ORM และสำหรับความเข้าใจพื้นฐานของข้อมูล ตารางที่มีระเบียนที่ซ้ำกันอาจเป็นอาการของการออกแบบที่ไม่ดี

อย่างน้อยที่สุดตารางอย่างน้อยควรมีคอลัมน์ข้อมูลประจำตัว การเพิ่มคอลัมน์ ID ที่สร้างอัตโนมัติจะใช้เวลาประมาณ 2 นาทีใน SQL Server และ 5 นาทีใน Oracle สำหรับความพยายามพิเศษนั้นหลายปัญหาจะถูกหลีกเลี่ยง


แอปพลิเคชันของฉันอยู่ในการตั้งค่าคลังข้อมูล (ด้วย Oracle) และคุณทำให้ฉันมั่นใจใน 5 นาทีเพื่อเพิ่มดัชนี ใช้เวลาเพียง 5 นาที (หรือมากกว่านั้นเล็กน้อยหากคุณต้องการค้นหาหรือแก้ไข ETL)
เทรนต์

0

เราพบปัญหานี้เช่นกันและในขณะที่เรามีคอลัมน์ที่มีค่า Null สิ่งสำคัญคือเรามีคอลัมน์ที่ต้องพึ่งพาซึ่งไม่มีค่า Null และการรวมกันของสองคอลัมน์นี้ไม่ซ้ำกัน

ดังนั้นเพื่ออ้างคำตอบที่ได้รับจาก Pratap Reddy มันใช้ได้ดีสำหรับเรา


0

ฉันมีความสุขมากปัญหาของฉันได้รับการแก้ไข

ไม่สามารถอัปเดต EntitySet - เนื่องจากมี DefiningQuery และไม่มีองค์ประกอบ <UpdateFunction> อยู่

และทำสิ่งนี้: ดูด้านล่างบรรทัดนั้นและค้นหาแท็ก มันจะมีคำสั่งเลือก ol ขนาดใหญ่ในนั้น ลบแท็กและเนื้อหาของมัน ..

ตอนนี้โดยไม่เปลี่ยน DB TI สามารถแทรกลงในตารางที่ไม่มี PK ได้

ขอบคุณทุกคนและขอบคุณ Pharylon


0

ใน EF Core 5.0 คุณจะสามารถกำหนดระดับเอนทิตีได้เช่นกัน

[Keyless]
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public int Zip { get; set; }
}

การอ้างอิง: https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-5.0/whatsnew#use-ac-attribute-to-indicate-that-an-entity- มีไม่มีคีย์


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