如何配置这种一对零或一的关系?
How to configure this one-to-zero-or-one relationship?
我知道在 SO 上有一些关于 1:0..1 关系的已回答问题。我看过 this and ,但认为它们不适用于我的问题。
我在 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 服务器对象资源管理器中添加项目,我必须为 PK 输入一个值。
我做错了什么?
正如你所说:
The relationships between a FrontPageItem
and each of the different element types are one-to-zero-or-one
. An element can exist without being added as a FrontPageItem
, meaning that a FrontPageItem
has a relationship to just one element, either an Article
or a WebPage
.
然后从FrontPageItem
中删除ArticleId
和WebPageId
作为EF核心支持one-to-one-or-zero
原则上没有外键的关联table:
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
}
我知道在 SO 上有一些关于 1:0..1 关系的已回答问题。我看过 this and
我在 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 服务器对象资源管理器中添加项目,我必须为 PK 输入一个值。
我做错了什么?
正如你所说:
The relationships between a
FrontPageItem
and each of the different element types areone-to-zero-or-one
. An element can exist without being added as aFrontPageItem
, meaning that aFrontPageItem
has a relationship to just one element, either anArticle
or aWebPage
.
然后从FrontPageItem
中删除ArticleId
和WebPageId
作为EF核心支持one-to-one-or-zero
原则上没有外键的关联table:
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
}