ฉันจะเริ่มต้นข้อมูลหลักระหว่างวิธี OnModelCreating ของ DbContext ในกรณีที่เปิดใช้งานคีย์หลักที่สร้างอัตโนมัติได้อย่างไร

กรอบงานแอปพลิเคชัน: ASPNET Core 2.1

นี่คือชั้นเรียนของฉัน

public class Employee
{
    [DataMember(Name = "key")]
    [Key]
    public Guid Key { get; set; }
    [Required]
    [DataMember(Name = "Name")]
    public string Name { get; set; }
}

ฉันมีโค้ดด้านล่างซึ่งเปิดใช้งานการเพาะข้อมูลและการสร้างอัตโนมัติของคอลัมน์ Guid

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        //Auto generation of Guid
        modelBuilder.Entity<Employee>().Property(x => x.Key).HasDefaultValueSql("NEWID()");

        //seeding of data
        modelBuilder.Entity<Employee>().HasData(
            new Employee{ Name = "Hamlet" },
            new Employee{ Name = "King Lear" },
            new Employee{ Name = "Othello" }
        );
    }

ฉันได้รับข้อผิดพลาดด้านล่างขณะรันคำสั่ง add-migration InitialCreate

ไม่สามารถเพิ่มเอนทิตีเริ่มต้นสำหรับเอนทิตีประเภท 'พนักงาน' ได้ เนื่องจากไม่มีค่าที่ให้ไว้สำหรับคุณสมบัติ 'คีย์' ที่จำเป็น

ฉันไม่ต้องการส่งค่าสำหรับ Key ฉันต้องการให้สร้างอัตโนมัติในฐานข้อมูล SQL Server

ข้อกำหนดพื้นฐานของฉันคือ: ใส่ข้อมูลหลัก (อัปเดต) ทุกครั้งที่ฉันรัน update-database ในคอนโซลตัวจัดการแพ็คเกจ


person kudlatiger    schedule 24.11.2018    source แหล่งที่มา
comment
จนถึงตอนนี้ เมธอด HasData ไม่มีการโอเวอร์โหลดที่ยอมรับข้อกำหนดคีย์ที่ตรงกัน ดังที่ AddOrUpdate มี อาจเป็นคำขอคุณลักษณะ จนกว่าจะถึงตอนนั้น ตัวเลือกเดียวของคุณคือระบุค่าคีย์ อย่างไรก็ตาม โปรดทราบว่าคุณจะต้องใช้คีย์ที่ระบุเสมอ หากคุณต้องการเริ่มต้นข้อมูลที่อ้างอิงถึง Employee ด้วย   -  person Gert Arnold    schedule 24.11.2018


คำตอบ (1)


ลองเพิ่มแอตทริบิวต์ต่อไปนี้ในคุณสมบัติ Key:.

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

ซึ่งจะสั่งให้ DB สร้าง Key อัตโนมัติเมื่อไม่มีการระบุ

อัปเดต

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

อย่างไรก็ตาม วิธีแก้ไขคือการแทรกบันทึกที่จำเป็นในฐานข้อมูลด้วยตนเองหลังจากเริ่มต้นแล้ว (เช่น หลังจากคุณโทร context.Database.Migrate() เป็นต้น) แน่นอนที่นี่คุณต้องตรวจสอบด้วยตนเองว่าไม่มีบันทึกที่ระบุอยู่หรือไม่

person Martin Zikmund    schedule 24.11.2018
comment
ไม่ทำงาน. มันแสดงข้อผิดพลาดเดียวกัน ฉันมี modelBuilder.Entity‹Employee›().Property(x =› x.Key).HasDefaultValueSql(NEWID()); สำหรับการสร้างอัตโนมัติ 'add-migration' ใช้งานได้หากฉันลบรหัสข้อมูลเริ่มต้น แล้วทางเลือกอื่นสำหรับข้อมูลเมล็ดพันธุ์คืออะไร? - person kudlatiger; 24.11.2018
comment
มันแก้ไขปัญหาแต่ไม่ได้แก้ไขความต้องการ มันคือการใส่คีย์ที่ผมระบุไว้ตามที่คุณแนะนำ ฉันต้องการดูคำแนะนำที่สร้างขึ้นอัตโนมัติในฐานข้อมูล - person kudlatiger; 24.11.2018
comment
หากคุณรวมส่วนที่อัปเดตของคำถามของฉันและแอตทริบิวต์ [DatabaseGenerated(Identity)] เข้าด้วยกัน ก็ควรจะใช้ได้ - person Martin Zikmund; 24.11.2018