簡體   English   中英

類型參數如何傳遞給下一個方法

[英]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 ,所以TEntityStudent 編譯器將看到您的lambda表達式,並推斷s必須為Student ,因為這是將lambda表達式轉換為Expression<Func<TEntity,TRelatedEntity>>的唯一方法。

還要注意, HasOne返回ReferenceNavigationBuilder<TEntity,TRelatedEntity> ,它允許您鏈接其他調用,並且現在您已經傳遞了兩個類型信息TEntityTRelatedEntity

實際上,您不需要為HasOne指定通用參數,編譯器也可以推斷出這些參數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM