【问题标题】:Two one-side represented relationships on same entities interpreted as the same relationship同一实体上的两个单向表示关系解释为同一关系
【发布时间】:2019-12-16 17:45:10
【问题描述】:

我有 2 个实体,书和作者。

一本书有一个作者,一个作者有一本最喜欢的书,尽管这显然不是同一个关系。

所以,我们有:

  • 一本书有一个作者,而这个作者有很多本书(1-m);
  • 一位作者有一本最喜欢的书,而某本书已被一位作者收藏[是的,让我们承认它不能被 2 个作者收藏] (1-1)。

每次我只想在实体中表示关系的第一部分,因为我不需要第二部分。

如何使用 EF Core 表示这种关系?因为Ef Core倾向于认为第二个关系的第一部分是第一个关系的第一个par的结束部分=> 1-[m][1-]1。

public class Book
{
    public Author Author { get; set; }
}

public class Author
{
    public Book FavouriteBook { get; set; }
}

这不起作用,因为 EF Core 认为它们都是同一个 1-1 关系的一部分。

Book.Author 不是收藏这本书的作者。 Author.FavouriteBook 不是作者写的书之一。

我不能使用ModelBuilder,因为每次我都没有对应的关系。

【问题讨论】:

  • 您的表具有 1-M 和 1-1 关系,但您的实体仅显示 1-1 关系。 Book.Author 只是 some 关系的一端。在没有任何其他配置的情况下,EF Core 正确地假定它与 FavouriteBook 是 1-1 关系。 each time I don't have the counterpart of the relation. 这将是 Books 上的 Author 属性
  • 是的,我知道,但我不想在我的实体上拥有其他属性,所以我想知道是否有一些可用的配置告诉 EF Core 这些不一样关系。

标签: c# .net .net-core entity-framework-core


【解决方案1】:

我不能使用ModelBuilder,因为每次我都没有对应的关系。

您可以,而且您应该使用 fluent API 来映射(配置)所需的关系。关系配置允许您指定每一端的导航属性(或无属性),例如

// Book.Author 1..N Author(no navigation property)
modelBuilder.Entity<Book>()
    .HasOne(book => book.Author);
    .WithMany();

// Author.FavouriteBook 1..1 Book(no navigation property)
modelBuilder.Entity<Author>()
    .HasOne(author => author.FavouriteBook)
    .WithOne()
    .HasForeignKey<Author>("FavouriteBookId");

注意带有泛型类型参数的HasForeignKey 调用。这通常总是需要一对一的关系,主要是为了指定哪一端是依赖的(通过泛型类型参数)。对于一对多,一方总是主体,多方总是依赖,所以不需要这样的配置。

更多信息,请参阅Relationships

【讨论】:

  • 是的,当我说“我不能使用ModelBuilder”时,我没有正确表达自己。好的,我不知道没有参数的WithMany()WithOne()。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2020-08-25
相关资源
最近更新 更多