ASP.NET додає міграцію "складова помилка первинного ключа", як використовувати вільний API


77

Привіт! Я перебуваю в процесі створення веб-програми і вже встановив як Microsoft.entityFrameworkCore, так і Microsoft.entityFrameworkCore.Tools .

Під час виконання додаткової міграції в консолі менеджера пакетів я отримую повідомлення про помилку

" System.InvalidOperationException: Тип сутності" Attends "має складений первинний ключ, визначений з анотаціями даних. Щоб встановити складений первинний ключ, використовуйте вільний API "

Ось мій код у папці сутності.

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; }
    }
}

Як налаштувати його, щоб правильно встановити складену клавішу?

Відповіді:


172

На ядрі EF ..

Складені ключі можна налаштувати лише за допомогою API Fluent - домовленості ніколи не налаштовують складений ключ, і ви не можете використовувати Анотації даних для його налаштування.

Ось версія Fluent API :

Примітка: Це лише приклад. Будь ласка, відрегулюйте його відповідно до вашого варіанту використання.

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

Детальніше про це ви можете прочитати тут: складений ключ


2
Ти чоловік! Просто запустив його і також отримав помилку в класі Child. Я буду використовувати цей приклад, рухаючись вперед. Дякую!
RyeGuy,

19
Можливо, варто згадати, що це на DBContext, а не на об'єкті Attends, на випадок, якщо це не очевидно для когось іншого.
kiml42

6
Будь-яка ідея, чому цього не можна зробити за допомогою анотації? Чому ми змушені використовувати вільний API?
Приянк Панчал

@PriyankPanchal: Тому що Microsoft покращила ситуацію. Мабуть, це працювало чудово до Core.
Джонатан Вуд,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.