在EF核心中建立外键关系

时间:2019-03-17 18:04:29

标签: c# entity-framework asp.net-core

所以我有两个模型。 MovieModel和MovieQueryModel。每个电影都有一个对应的电影查询。但是电影查询并不总是具有相关的电影。

因此,在我的数据库中,我希望电影表中的一列具有对相应电影查询的引用。但是,我的电影查询表中不需要引用电影的列。

我本来以为这是一对一的外键关系,但是我开始对此表示怀疑。对于EF中一对一的外键关系,我似乎需要在两个模型中都引用另一个模型。

似乎我可以从MovieQueryModel引用MovieModel并将其设置为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 :(得分:0)

是的,很可能是一对一的关系。

您要做的是在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不需要根据您的请求增加任何列。