如何配置这种一对一或一对一的关系?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何配置这种一对一或一对一的关系?相关的知识,希望对你有一定的参考价值。

我知道关于1:0..1-关系的问题有一些问题。我看过thisthis,但不认为它们适用于我的问题。

我在CMS系统中有这三个(简化)模型。

public class FrontPageItem
{
    public int Id { get; set; }
    public int ItemType { get; set; } // 1 = Article, 2 = WebPage, etc...

    public int? ArticleId { get; set; }
    public Article Article { get; set; }

    public int? WebPageId { get; set; }
    public WebPage WebPage { get; set; }
}

public class Article
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Preamble { get; set; }
    public string MainText { get; set; }

    public int? FrontPageItemId { get; set; }
    public FrontPageItem FrontPageItem { get; set; }
}

public class WebPage
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int? FrontPageItemId { get; set; }
    public FrontPageItem FrontPageItem { get; set; }
}

FrontPageItem与每种不同元素类型之间的关系是一对一或一。元素可以存在而不被添加为FrontPageItem,这意味着FrontPageItem只与一个元素有关系,无论是Article还是WebPage

在尝试配置关系时,我添加了以下代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Article>()
        .HasOne(p => p.FrontPageItem)
        .WithOne(i => i.Article)
        .HasForeignKey<FrontPageItem>(b => b.Id);
    modelBuilder.Entity<WebPage>()
        .HasOne(p => p.FrontPageItem)
        .WithOne(i => i.WebPage)
        .HasForeignKey<FrontPageItem>(b => b.Id);
}

但我不认为这是正确的。我还没有为FrontPageItem制作CRUD视图,但如果我尝试直接在VS中的SQL Server对象资源管理器中添加项目,我必须输入PK的值。

我究竟做错了什么?

答案

如你所说:

FrontPageItem和每种不同元素类型之间的关系是one-to-zero-or-one。元素可以存在而不被添加为FrontPageItem,这意味着FrontPageItem只与一个元素有关系,无论是Article还是WebPage

然后从ArticleId中删除WebPageIdFrontPageItem作为EF核心支持one-to-one-or-zero关联,在原则表中没有外键:

public class FrontPageItem
{
    public int Id { get; set; }
    public int ItemType { get; set; } // 1 = Article, 2 = WebPage, etc...

    public Article Article { get; set; }
    public WebPage WebPage { get; set; }
}

然后qazxsw poi和qazxsw poi的Fluent API配置如下:

Article

以上是关于如何配置这种一对一或一对一的关系?的主要内容,如果未能解决你的问题,请参考以下文章

您如何使一对一或其他关系正常化?

用于一对一识别关系的实体框架代码优先流利 API 配置

如何将这种多对一的关系改为一对一?

一对多和递归关系 - 强制设置值

如何在 laravel 中以一对一的关系更新?

如何使用EF优雅的配置一对一的关系