簡體   English   中英

如何配置這種一對零或一的關系?

[英]How to configure this one-to-zero-or-one relationship?

我知道有一些關於 1:0..1 關系的已回答問題。 我已經看過這個這個,但不要認為它們適用於我的問題。

我在 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只與一個元素( ArticleWebPage

為了配置關系,我添加了以下代碼:

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只與一個元素( ArticleWebPage

然后從FrontPageItem刪除ArticleIdWebPageId因為 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; }
}

那么ArticleWebPageFleunt API配置如下:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Article>()
        .HasOne(a => a.FrontPageItem)
        .WithOne(f => f.Article)
        .HasForeignKey<Article>(a => a.FrontPageItemId); // <-- Here it is

    modelBuilder.Entity<WebPage>()
        .HasOne(wp => wp.FrontPageItem)
        .WithOne(f => f.WebPage)
        .HasForeignKey<WebPage>(wp => wp.FrontPageItemId); // <--Here it is
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM