ASP.NET fügt Migration 'Composite Primary Key Error' hinzu, wie eine fließende API verwendet wird

76

Hallo, ich bin gerade dabei, eine Webanwendung zu erstellen, und habe bereits Microsoft.entityFrameworkCore und Microsoft.entityFrameworkCore.Tools installiert .

Während der Ausführung einer Add-Migration in der Paketmanager-Konsole wird eine Fehlermeldung angezeigt

" System.InvalidOperationException: Für den Entitätstyp 'Attends' ist ein zusammengesetzter Primärschlüssel mit Datenanmerkungen definiert. Verwenden Sie zum Festlegen eines zusammengesetzten Primärschlüssels eine fließende API. "

Hier ist mein Code im Entitätsordner.

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace _3241_farmDb.Entities
{

    public class Farm
    {
        [Required, MaxLength(30)]
        [Key]
        public string FarmName { get; set; }
        [Required, MaxLength(15)]
        public string FarmCity { get; set; }
        [Required, MaxLength(9)]
        public string FarmerSSN { get; set; }
    }
    public class Farmer
    {
        [Required, MaxLength(9)]
        [Key]
        public int SS { get; set; }
        [Required, MaxLength(9)]
        public string Fname { get; set; }
        [Required, MaxLength(15)]
        public string Lname { get; set; }
        [Required, MaxLength(15)]
        public string CityName { get; set; }
        [Required, MaxLength(15)]
        public string Address { get; set; }
        [Required, MaxLength(30)]
        public string BoardPositionName { get; set; }
    }
    public class Child
    {
        [Required, MaxLength(9)]
        [Key]
        public int FarmerSS { get; set; }
        [Required, MaxLength(15)]
        [Key]
        public string Fname { get; set; }
        [Required, MaxLength(15)]
        [Key]
        public string Lname { get; set; }
        [Required]
        public int Age { get; set; }
    }
    public class Attends
    {

        [Key, Column(Order = 1)]
        public int FarmerSS { get; set; }
        [Key, Column(Order = 2)]
        public int HotelID { get; set; }
        [Required, MaxLength(15)]
        public string BoardPosition { get; set; }
    }

    public class Livestock
    {
        [Required, MaxLength(15)]
        public int LivestockID { get; set; }
        [Required, MaxLength(15)]
        public string LivestockType { get; set; }
    }
    public class Farm_Houses
    {
        [Required, MaxLength(15)]
        [Key]
        public int LivestockID { get; set; }
        [Required, MaxLength(15)]
        public string FarmName { get; set; }
    }
    public class Crops
    {
        [Required, MaxLength(15)]
        [Key]
        public int CropID { get; set; }
        [Required, MaxLength(15)]
        public string CropName { get; set; }
    }
}

Wie passe ich es an, um den zusammengesetzten Schlüssel richtig einzustellen?

RyeGuy
quelle

Antworten:

170

Auf EF Kern ..

Zusammengesetzte Schlüssel können nur mit der Fluent-API konfiguriert werden. Konventionen richten niemals einen zusammengesetzten Schlüssel ein und Sie können keine Datenanmerkungen verwenden, um einen zu konfigurieren.

Hier ist die Fluent API- Version:

Hinweis: Dies ist nur ein Beispiel. Bitte passen Sie es an Ihren Anwendungsfall an.

// (In the DbContext subclass)
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Attends>()
        .HasKey(c => new { c.FarmerSS, c. HotelID });
}

Hier können Sie mehr darüber lesen: Composite Key

Sampath
quelle
2
Du bist der Mann! Ich habe es einfach ausgeführt und auch in der Child-Klasse einen Fehler erhalten. Ich werde dieses Beispiel in Zukunft verwenden. Vielen Dank!
RyeGuy
18
Erwähnenswert ist wahrscheinlich, dass dies im DBContext und nicht im Attends-Objekt steht, falls dies für andere nicht offensichtlich ist.
Kiml42
5
Irgendeine Idee, warum dies nicht mit Anmerkungen möglich ist? Warum müssen wir eine flüssige API verwenden?
Priyank Panchal
@PriyankPanchal: Weil Microsoft die Dinge verbessert hat . Anscheinend hat es vor Core gut funktioniert.
Jonathan Wood