[英]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
傳遞給了下一個方法( Entity<Student>
返回值是下一個方法HasOne
的基礎對象)。
我猜您正在調用此方法 :
public virtual EntityTypeBuilder<TEntity> Entity<TEntity>() where TEntity : class;
仔細看看簽名。 該方法采用一個稱為TEntity
的通用參數,並返回EntityTypeBuilder<TEntity>
,使您可以在對Entity<TEntity>()
調用結束時,將可以在EntityTypeBuilder<TEntity>
上調用的所有調用鏈接起來。
在您的情況下,您調用了Entity<Student>()
,因此簽名指示結果必須為EntityTypeBuilder<Student>
。 然后,您可以調用EntityTypeBuilder<Student>.HasOne
:
public virtual ReferenceNavigationBuilder<TEntity,TRelatedEntity> HasOne<TRelatedEntity> (Expression<Func<TEntity,TRelatedEntity>> navigationExpression = null) where TRelatedEntity : class;
看看HasOne
接受什么HasOne
Expression<Func<TEntity,TRelatedEntity>>
。 因為您正在調用EntityTypeBuilder<Student>.HasOne
,所以TEntity
是Student
。 編譯器將看到您的lambda表達式,並推斷s
必須為Student
,因為這是將lambda表達式轉換為Expression<Func<TEntity,TRelatedEntity>>
的唯一方法。
還要注意, HasOne
返回ReferenceNavigationBuilder<TEntity,TRelatedEntity>
,它允許您鏈接其他調用,並且現在您已經傳遞了兩個類型信息TEntity
和TRelatedEntity
。
實際上,您不需要為HasOne
指定通用參數,編譯器也可以推斷出這些參數:
modelBuilder
.Entity<Student>()
.HasOne(s => s.Address)
.WithOne(ad => ad.Student);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.