Отображение составной таблицы в таблицу значений по умолчанию в EF Core - PullRequest
0 голосов
/ 12 мая 2019

У меня есть простая структура в базе данных:

CREATE TABLE user_categories (
    user_id INT NOT NULL,
    category_id INT NOT NULL,
    PRIMARY KEY (user_id, category_id)
);

CREATE TABLE user_defaults (
    user_id INT NOT NULL,
    category_id INT NOT NULL,
    PRIMARY KEY (user_id),
    FOREIGN KEY (user_id, category_id) REFERENCES user_categories (user_id, category_id)
);

Намерение здесь состоит в том, что пользователю назначен набор категорий, и есть таблица с таблицей по умолчанию (которая потенциально может иметь другие столбцы)

Однако я изо всех сил пытаюсь отобразить это в EF Core, я всегда получаю дополнительные столбцы в таблице user_categories.

Мой UserCategory класс:

using System.ComponentModel.DataAnnotations.Schema;

namespace EMMA.Authorization.Domain.Entities
{
    public class UserCategory
    {
        public int UserId { get; set; }    
        [ForeignKey(nameof(UserId))]
        public User User { get; set; }

        public int CategoryId { get; set; }
        [ForeignKey(nameof(CategoryId))]
        public Category Category { get; set; }

        public UserDefaults UserDefaults { get; set; }
    }
}

UserDefaults

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;

namespace EMMA.Authorization.Domain.Entities
{
    public class UserDefaults
    {
        public int UserId { get; set; }
        public int CategoryId { get; set; }

        public virtual ICollection<UserCategory> UserCategories { get; set; }
    }
}

Это OnModelCreating метод, который должен настраивать отношения:

modelBuilder.Entity<UserCategory>().HasKey(s => new { s.UserId, s.CategoryId });
modelBuilder.Entity<UserDefaults>().HasKey(s => s.UserId);
modelBuilder.Entity<UserDefaults>()
    .HasMany(s => s.UserCategories)
    .WithOne(s => s.UserDefaults)
    .HasForeignKey(s => new { s.UserId, s.CategoryId })
    .IsRequired();

Однако я получаю исключение, когда пытаюсь создать миграцию:

Отношение между UserCategory.UserDefaults и UserDefaults.UserCategories со свойствами внешнего ключане совместимоСконфигурируйте основной ключ или набор совместимых свойств внешнего ключа для этой взаимосвязи.

Как настроить такую ​​взаимосвязь в EF Core, как показано в SQL?

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Я действительно понял, что я объявил неправильные отношения, это не один ко многим, а скорее один к одному.Объявление следующего отображения работает как ожидалось:

modelBuilder.Entity<UserCategory>()
    .HasOne(s => s.UserDefaults)
    .WithOne(s => s.UserCategory)
    .HasForeignKey<UserDefaults>(s => new { s.UserId, s.CategoryId })
    .IsRequired();
0 голосов
/ 12 мая 2019

Объект user_catagories должен иметь составной ключ.Вы уже подразумеваете это, когда FK из другой таблицы будет составным ключом для первой.EF жалуется, потому что это на самом деле не так.Вы можете исправить это, пометив оба члена как первичные, например:

public class UserCatagory
{
      [Key, Column(Order = 0)]
      public int UserId { get; set; }

      [Key, Column(Order = 1)]
      public int CategoryId { get; set; }

      // Etc...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...