Установка отношения внешнего ключа в ядре EF - PullRequest
0 голосов
/ 17 марта 2019

Итак, у меня есть две модели. MovieModel и MovieQueryModel. Каждый фильм имеет соответствующий запрос фильма. Но запрос фильма не всегда имеет связанный фильм.

Так что в моей базе данных я бы хотел столбец в моей таблице фильмов, который имеет ссылку на соответствующий запрос фильма. Но мне не нужен столбец в моей таблице запросов фильмов, который ссылается на фильм.

Первоначально я думал, что это будут отношения один-на-один, но я начинаю сомневаться в этом. Похоже, что для отношения внешнего ключа один к одному в EF мне нужна ссылка в обеих моделях на другую модель.

Кажется, что я мог бы сделать ссылку на MovieModel из MovieQueryModel и просто установить ее в null для запросов без совпадения, но я не хочу этого делать. Похоже, есть лучший способ.

Это отношения один на один? Если нет, то что это за отношения и как мне настроить мои модели в EF Core для поддержки этого поведения? Мои модели ниже.

MovieQueryModel.cs

namespace imdb_data_retrieval.Models
{
    public class MovieQueryModel
    {
        public MovieQueryModel(string queryTitle, string queryReleaseYear, string result){
            id = Guid.NewGuid();
            QueryTitle = queryTitle;
            QueryReleaseYear = queryReleaseYear;
            Result = result;
            QueryDate = DateTime.Now;
        }

        [Key]
        public Guid Id { get; set; }
        [Required]
        public string QueryTitle { get; set; }
        [Required]
        public string QueryReleaseYear { get; set; }
        public string Result { get; set; }
        public DateTime QueryDate { get; set; }
    }
}

MovieModel.cs

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using MediatR;

namespace imdb_data_retrieval.Models
{
    public class MovieModel
    {
        public MovieModel(string title, int releaseYear){
            id = Guid.NewGuid();
            Title = title;
            ReleaseYear = releaseYear;
            ImdbId = null;
            QueryDate = DateTime.Now;
        }
        [Key]
        public Guid id { get; set; }
        [ForeignKey("MovieQuery")]
        public Guid RelatedQuery { get; set; }
        public string Title { get; set; }
        public int ReleaseYear { get; set; }
        public string ImdbId { get; set; }
        public DateTime QueryDate { get; set; }
    }
}

1 Ответ

0 голосов
/ 18 марта 2019

Да, это вполне может быть отношение ноль-один-к-одному.

Что вы делаете в своей MovieModel, вы ссылаетесь на MovieQueryModelId (и, между прочим, что с xyzModel, просто используйте Moive без суффикса).

Примерно так:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using MediatR;

namespace imdb_data_retrieval.Models
{
    public class MovieModel
    {
        public MovieModel(string title, int releaseYear){
            id = Guid.NewGuid();
            Title = title;
            ReleaseYear = releaseYear;
            ImdbId = null;
            QueryDate = DateTime.Now;
        }
        [Key]
        public Guid id { get; set; }
        [ForeignKey("MovieQuery")] //<-- remove this (EF automatically does it at the relationship stuff)
        public Guid RelatedQuery { get; set; } // <-- remove this
        public string Title { get; set; }
        public int ReleaseYear { get; set; }
        public string ImdbId { get; set; }
        public DateTime QueryDate { get; set; }

        //relationship stuff
        public MovieQueryModel MovieQueryModel {get; set;}
        public Guid? MovieQueryModel {get; set;}
    }
}

Когда вы добавляете миграцию, EF автоматически связывает таблицы в соответствии с моделью.Таким образом, у каждого фильма будет ноль или один MovieQuery, в то время как вашему MovieQuery не потребуется дополнительный столбец согласно вашему запросу.

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