类型参数如何传递给 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
,所以 TEntity
是 Student
。编译器看到您的 lambda 表达式并推断 s
必须是 Student
,因为这是将 lambda 表达式转换为 Expression<Func<TEntity,TRelatedEntity>>
.
的唯一方法
还要注意 HasOne
returns a ReferenceNavigationBuilder<TEntity,TRelatedEntity>
,它允许你链接其他调用,现在你已经传递了两条类型信息 TEntity
和TRelatedEntity
.
实际上,您不需要为HasOne
指定泛型参数,编译器也可以推断出那些:
modelBuilder
.Entity<Student>()
.HasOne(s => s.Address)
.WithOne(ad => ad.Student);
给定以下方法链:
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
,所以 TEntity
是 Student
。编译器看到您的 lambda 表达式并推断 s
必须是 Student
,因为这是将 lambda 表达式转换为 Expression<Func<TEntity,TRelatedEntity>>
.
还要注意 HasOne
returns a ReferenceNavigationBuilder<TEntity,TRelatedEntity>
,它允许你链接其他调用,现在你已经传递了两条类型信息 TEntity
和TRelatedEntity
.
实际上,您不需要为HasOne
指定泛型参数,编译器也可以推断出那些:
modelBuilder
.Entity<Student>()
.HasOne(s => s.Address)
.WithOne(ad => ad.Student);