类型参数如何传递给 next 方法

How type parameters are passed to next method

给定以下方法链:

    modelBuilder
        .Entity<Student>()
        .HasOne<StudentAddress>(s => s.Address)
        .WithOne(ad => ad.Student);

HasOne 如何知道其先前方法 Entity<Student> 提供的 Student 类型(在 lambda 参数中显示)?

在我看来,好像 Entity<Student> 以某种方式通过链接将其指定的类型参数 Student 传递给下一个方法(return Entity<Student> 的值是下一个方法 HasOne).

我猜你打电话给 this method:

public virtual EntityTypeBuilder<TEntity> Entity<TEntity>() where TEntity : class;

仔细看看签名。该方法采用一个名为 TEntity 的通用参数和 returns 一个 EntityTypeBuilder<TEntity>,允许您在对 EntityTypeBuilder<TEntity> 的调用结束时链接任何可以在 EntityTypeBuilder<TEntity> 上调用的调用=16=]呼唤。

在您的例子中,您调用了 Entity<Student>(),因此签名规定结果必须是 EntityTypeBuilder<Student>。然后,您可以调用 EntityTypeBuilder<Student>.HasOne:

public virtual ReferenceNavigationBuilder<TEntity,TRelatedEntity> HasOne<TRelatedEntity> (Expression<Func<TEntity,TRelatedEntity>> navigationExpression = null) where TRelatedEntity : class;

看看 HasOne 接受什么 - Expression<Func<TEntity,TRelatedEntity>>。因为你调用的是 EntityTypeBuilder<Student>.HasOne,所以 TEntityStudent。编译器看到您的 lambda 表达式并推断 s 必须是 Student,因为这是将 lambda 表达式转换为 Expression<Func<TEntity,TRelatedEntity>>.

的唯一方法

还要注意 HasOne returns a ReferenceNavigationBuilder<TEntity,TRelatedEntity>,它允许你链接其他调用,现在你已经传递了两条类型信息 TEntityTRelatedEntity.

实际上,您不需要为HasOne指定泛型参数,编译器也可以推断出那些:

modelBuilder
    .Entity<Student>()
    .HasOne(s => s.Address)
    .WithOne(ad => ad.Student);