所以我有两个型号。 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; }
}
}
是的,它可能是零一对一的关系。
你在MovieModel上做的是你引用MovieQueryModelId(和btw 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会根据模型自动绑定表。这样每个Movie都会有零个或一个MovieQuery,而你的MovieQuery根据你的要求不需要任何额外的列。