Как настроить это отношение один к нулю или один? - PullRequest
1 голос
/ 28 апреля 2019

Я знаю, что на SO есть ответы на некоторые вопросы об отношениях 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 имеет отношение только к одному элементу, либо 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);
}

Но я не думаю, что это правильно. Я еще не сделал CRUD-представления для FrontPageItem, но если я пытаюсь добавить элементы непосредственно в проводнике объектов SQL Server в VS, я должен ввести значение для PK.

Что я делаю не так?

1 Ответ

1 голос
/ 28 апреля 2019

Как вы сказали:

Отношения между FrontPageItem и каждым из различных типов элементов: one-to-zero-or-one.Элемент может существовать без добавления в качестве FrontPageItem, что означает, что FrontPageItem имеет отношение только к одному элементу, либо Article, либо WebPage.

Затем удалите ArticleId и WebPageId из FrontPageItem в качестве поддержки ядра 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; }
}

Затем конфигурация Fleunt API для Article иWebPage следующим образом:

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
}
...