久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

MikroORM Type-Safe Relations 實(shí)戰(zhàn):用 `Ref`、`LazyRef` 與 `Loaded` 在編譯期杜絕“幽靈關(guān)聯(lián)“

MikroORM Type-Safe Relations 實(shí)戰(zhàn):用 `Ref`、`LazyRef` 與 `Loaded` 在編譯期杜絕“幽靈關(guān)聯(lián)“ 后端【免費(fèi)下載鏈接】mikro-ormTypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases.項(xiàng)目地址https://gitcode.com/gh_mirrors/mi/mikro-orm點(diǎn)擊查看免費(fèi)下載本篇指南圍繞 MikroORM 7.1 版本文檔docs/versioned_docs/version-7.1/type-safe-relations.md展開(kāi)系統(tǒng)講解如何把實(shí)體關(guān)聯(lián)從運(yùn)行時(shí)才知道是否已加載的盲區(qū)提升為編譯期即可感知的類型安全體驗(yàn)。讀完你將掌握四種互相配合的工具——Reference包裝器、LazyRef類型級(jí)引用、Loaded類型與$同步訪問(wèn)器以及unref()/Loadable/ScalarReference等配套 API能夠?qū)懗鑫醇虞d即編譯報(bào)錯(cuò)、已加載即同步訪問(wèn)的實(shí)體層代碼。為什么關(guān)系需要類型安全在 MikroORM 中實(shí)體關(guān)系被映射為實(shí)體引用entity reference——即至少攜帶主鍵的實(shí)體實(shí)例該引用存放在 Identity Map 中因此同一份數(shù)據(jù)反復(fù)查詢得到的是同一個(gè)對(duì)象引用ManyToOne(() Author) author!: Author;問(wèn)題在于TypeScript 無(wú)法靜態(tài)判斷該關(guān)系是否已真正從數(shù)據(jù)庫(kù)加載。author屬性的類型永遠(yuǎn)是Author即使它只是一個(gè)只有主鍵、其余屬性未初始化的引用stubconst book await em.findOne(Book, 1); console.log(book.author instanceof Author); // true —— 是 Author 實(shí)例 console.log(wrap(book.author).isInitialized()); // false —— 但并未加載 console.log(book.author.name); // undefined —— Author 尚未加載這種看起來(lái)是實(shí)體、摸起來(lái)卻是空殼的關(guān)聯(lián)是運(yùn)行時(shí)錯(cuò)誤的溫床。為此 MikroORM 提供了一整套類型安全工具Reference包裝器把關(guān)系包裝成RefT顯式區(qū)分已加載/未加載狀態(tài)Loaded類型在類型層面追蹤哪些關(guān)系已被populate$訪問(wèn)器對(duì)已加載關(guān)系提供類型安全的同步訪問(wèn)。其類型核心定義位于 typings.ts運(yùn)行時(shí)包裝器實(shí)現(xiàn)在 Reference.ts。Reference包裝器Reference包裝一個(gè)實(shí)體引用并提供一組安全的訪問(wèn)方法方法說(shuō)明load()加載實(shí)體返回PromiseTload(prop)加載實(shí)體并返回指定屬性loadOrFail()加載實(shí)體找不到時(shí)拋出錯(cuò)誤行為同em.findOneOrFail()unwrap()返回底層實(shí)體不安全可能未初始化isInitialized()返回實(shí)體是否已加載getEntity()返回實(shí)體未初始化則拋出錯(cuò)誤getProperty(prop)返回屬性未初始化則拋出錯(cuò)誤$/get()同步訪問(wèn)僅在LoadedReference上可用從源碼看Reference類Reference.ts在構(gòu)造時(shí)會(huì)把實(shí)體的主鍵屬性通過(guò)Object.defineProperty復(fù)制到包裝器上這就是ref.id無(wú)需unwrap()即可直接讀取的原因同時(shí)$與get是定義在Reference.prototype上的取值器Reference.ts分別直接返回底層實(shí)體。定義引用屬性使用RefT類型加上ref: true選項(xiàng)來(lái)聲明引用屬性。MikroORM 7 支持defineEntity、reflect-metadata、ts-morph 等多種實(shí)體定義方式本文按官方文檔的四種 Tab 逐一給出方式一defineEntity class 組合import { defineEntity, p } from mikro-orm/core; const BookSchema defineEntity({ name: Book, properties: { id: p.integer().primary(), author: p.manyToOne(() Author).ref(), }, }); export class Book extends BookSchema.class {} BookSchema.setClass(Book);方式二純defineEntity無(wú) classimport { defineEntity, p } from mikro-orm/core; export const Book defineEntity({ name: Book, properties: { id: p.integer().primary(), author: () p.manyToOne(Author).ref(), }, });方式三reflect-metadata 裝飾器import { Entity, Ref, ManyToOne, PrimaryKey, ref } from mikro-orm/core; Entity() export class Book { PrimaryKey() id!: number; ManyToOne(() Author, { ref: true }) author: RefAuthor; constructor(author: Author) { this.author ref(author); } }方式四ts-morph無(wú)參數(shù)推斷的裝飾器寫(xiě)法import { Entity, Ref, ManyToOne, PrimaryKey, ref } from mikro-orm/core; Entity() export class Book { PrimaryKey() id!: number; ManyToOne() author: RefAuthor; constructor(author: Author) { this.author ref(author); } }使用引用未加載時(shí)Ref只暴露主鍵任何對(duì)非主鍵屬性的訪問(wèn)都會(huì)得到編譯錯(cuò)誤const book await em.findOne(Book, 1); // 引用尚未加載 book.author; // RefAuthor book.author.isInitialized(); // false book.author.id; // OK —— 主鍵永遠(yuǎn)可用 book.author.name; // TS 錯(cuò)誤 —— RefAuthor 上沒(méi)有 name // 加載引用 const author await book.author.load(); author.name; // OK —— 現(xiàn)在已加載 // 或者只加載并取出某個(gè)屬性 const name await book.author.load(name);當(dāng)關(guān)系被 populate 后你得到的是LoadedReference可以通過(guò)$同步訪問(wèn)const book await em.findOne(Book, 1, { populate: [author] }); book.author; // LoadedReferenceAuthor book.author.$.name; // OK —— 類型安全的同步訪問(wèn) book.author.get().name; // 同上另一種等價(jià)寫(xiě)法嚴(yán)格校驗(yàn)getEntity/getPropertyunwrap()是裸奔接口而getEntity()/getProperty()會(huì)在未初始化時(shí)拋錯(cuò)適合在需要強(qiáng)校驗(yàn)的場(chǎng)景使用const book await em.findOne(Book, 1); // 未初始化時(shí)拋錯(cuò) book.author.getEntity(); // Error: ReferenceAuthor not initialized book.author.getProperty(name); // Error: ReferenceAuthor not initialized // 先加載再同步訪問(wèn) await book.author.load(); book.author.getEntity().name; // OK book.author.getProperty(name); // OK對(duì)應(yīng)錯(cuò)誤信息由getEntity()在未初始化時(shí)拋出Reference.ts。與wrap(entity).init()總是從數(shù)據(jù)庫(kù)刷新不同Reference.load()只有當(dāng)實(shí)體不在 Identity Map 中時(shí)才會(huì)發(fā)起查詢——已加載則直接復(fù)用內(nèi)存中的對(duì)象見(jiàn) Reference.ts 中isInitialized()與refresh選項(xiàng)的分支邏輯。LazyRefT—— 類型層面的引用如果你想要編譯期的 populate 狀態(tài)安全但又不想承擔(dān)Reference帶來(lái)的.$/.get()間接訪問(wèn)可以使用LazyRefT。它是純類型標(biāo)記運(yùn)行時(shí)屬性直接持有實(shí)體實(shí)例與不帶ref: true的普通關(guān)系完全一致但 TypeScript 在Loaded收窄之前只允許你訪問(wèn)主鍵。ManyToOne(() Author) author!: LazyRefAuthor;用defineEntity時(shí)對(duì)應(yīng).lazyRef()const BookSchema defineEntity({ name: Book, properties: { author: () p.manyToOne(AuthorSchema).lazyRef(), }, });從源碼看LazyRef是一個(gè)帶唯一符號(hào)品牌brand的交叉類型{ [K in PrimaryPropertyT keyof T]: T[K] } LazyRef.BrandTtypings.ts它把可訪問(wèn)屬性收窄為主鍵其余屬性在編譯期被鎖住。語(yǔ)義對(duì)比LazyRefTvsRefTLazyRefTRefT運(yùn)行時(shí)值實(shí)體實(shí)例stub 或已水合Reference包裝器instanceof T運(yùn)行時(shí)truefalse訪問(wèn)未加載的主鍵ref.id?ref.id?訪問(wèn)未加載的非主鍵編譯錯(cuò)誤 ?編譯錯(cuò)誤 ?訪問(wèn)已加載屬性loaded.author.name無(wú).$loaded.author.$.nameload()/loadOrFail()方法? —— 需在目標(biāo)實(shí)體上用Loadablemixin? 內(nèi)置關(guān)于instanceof的注意點(diǎn)上表中的instanceof T指的是運(yùn)行時(shí) JS 檢查——book.author instanceof Author返回true。但 TypeScript 的instanceof控制流收窄不會(huì)剝離LazyRefT的品牌標(biāo)記所以if (book.author instanceof Author) { /* 這里 book.author.name 依然是編譯錯(cuò)誤 */ }并不能讓你獲得完整實(shí)體訪問(wèn)。請(qǐng)使用unref()或Loaded收窄來(lái)獲得編譯期訪問(wèn)。用法示例const book await em.findOneOrFail(Book, 1); book.author.id; // ok —— 主鍵總是可訪問(wèn) book.author.name; // 編譯錯(cuò)誤 —— 未加載 const loaded await em.findOneOrFail(Book, 1, { populate: [author] }); loaded.author.name; // ok —— LoadedBook, author 把 LazyRefAuthor 收窄為 Author測(cè)試 lazy-ref.test.ts 對(duì)上述語(yǔ)義做了逐一驗(yàn)證運(yùn)行時(shí)值是實(shí)體實(shí)例而非包裝器第 85-90 行、未 populate 時(shí)主鍵可訪問(wèn)而name是編譯錯(cuò)誤第 126-133 行、populate 后Loaded收窄恢復(fù)完整訪問(wèn)第 135-140 行。適用范圍LazyRefT只用于 to-one 關(guān)系ManyToOne、OneToOne。集合關(guān)系本身已有CollectionT的間接層無(wú)需此標(biāo)記。注意安全邊界該安全純粹是編譯期的。JS 代碼、as any強(qiáng)轉(zhuǎn)、或繞過(guò)Loaded的代碼路徑在運(yùn)行時(shí)可以自由讀取任何屬性——對(duì)未 populate 的引用只有主鍵的 stub這些讀取會(huì)得到undefined。如果關(guān)系已被 populate底層實(shí)體已完全水合讀取行為正常該警告只針對(duì) stub 場(chǎng)景與普通非Ref關(guān)系是同一個(gè)坑。類型性能LazyRefT在Loaded/AutoPath收窄路徑上只增加一個(gè)條件分支成本與RefT相當(dāng)已加載收窄時(shí)甚至略便宜因?yàn)椴粫?huì)產(chǎn)生LoadedReference交叉類型。測(cè)量數(shù)據(jù)見(jiàn) tests/bench/types/lazy-ref.tsLoaded LazyRef - single to-one為 954 次實(shí)例化對(duì)應(yīng)Ref基線為 971 次深層鏈5 級(jí)AutoPath LazyRef為 1165 次實(shí)例化。unref()—— 無(wú)法穿透Loaded時(shí)的逃生通道當(dāng)代碼周圍都是裸Book類型而非LoadedBook, author而你確信關(guān)系已被 populate 時(shí)用unref()把LazyRefT或RefT收窄回Timport { unref } from mikro-orm/core; function logAuthor(book: Book) { // book.author 是 LazyRefAuthor —— 直接寫(xiě) .name 是編譯錯(cuò)誤 console.log(unref(book.author).name); }unref()是ref()的逆操作作用于以下幾類值實(shí)現(xiàn)見(jiàn) Reference.tsRefT/ReferenceT實(shí)體—— 調(diào)用.unwrap()返回TLazyRefT—— 運(yùn)行時(shí)身份轉(zhuǎn)換底層值本來(lái)就是T返回T普通T—— 透?jìng)鞣祷豑ScalarReferenceV/ScalarRefV—— 調(diào)用.unwrap()返回V | undefined標(biāo)量可能未綁定null/undefined—— 透?jìng)鳌:推胀╝s強(qiáng)轉(zhuǎn)一樣unref()對(duì)實(shí)體關(guān)系只做編譯期收窄——若實(shí)體是從未 populate 的 stub非主鍵屬性在運(yùn)行時(shí)仍是undefined。在你確信關(guān)系已加載時(shí)使用它能穿透Loaded時(shí)優(yōu)先選擇把它寫(xiě)進(jìn)函數(shù)簽名。測(cè)試 lazy-ref.test.ts 覆蓋了unref()對(duì)LazyRef、Ref、普通實(shí)體、標(biāo)量引用及null/undefined的全部行為。Loadablemixin —— 在實(shí)體上獲得load()/loadOrFail()如果你用的是普通關(guān)系或LazyRefT又想要Reference包裝器提供的load()/loadOrFail()便利可以在實(shí)體類上啟用Loadablemixin。它把這兩個(gè)方法掛到實(shí)體原型上讓你能直接在關(guān)系目標(biāo)上調(diào)用import { BaseEntity, Loadable, LoadableBaseEntity } from mikro-orm/core; // 便捷方式BaseEntity 已預(yù)組合該 mixin class User extends LoadableBaseEntity { // ... } // 獨(dú)立方式不繼承任何基類 class Product extends Loadable() { // ... } // 或與自己的基類組合 class Article extends Loadable(MyBase) { // ... } const user orm.em.getReference(User, 1); const loaded await user.load(); // PromiseUser | null const loadedOrThrows await user.loadOrFail(); // PromiseUser該 mixin 的實(shí)現(xiàn)位于 BaseEntity.tsload()內(nèi)部就是Reference.create(this).load(...)因此同樣遵循已加載則不重復(fù)查詢的 Identity Map 語(yǔ)義LoadableBaseEntity是Loadable(BaseEntity)的預(yù)組合別名BaseEntity.ts。按設(shè)計(jì)選擇啟用BaseEntity本身不會(huì)獲得這兩個(gè)方法因此已擁有l(wèi)oad/loadOrFail屬性的實(shí)體不會(huì)受影響。反過(guò)來(lái)若對(duì)已定義load的基類應(yīng)用 mixin會(huì)觸發(fā)編譯錯(cuò)誤以防止靜默覆蓋EnsureNoLoadConflict檢查BaseEntity.ts。Loaded類型LoadedEntity, Hints在編譯期追蹤哪些關(guān)系已被 populate。所有em.find*方法都返回該類型// 類型LoadedUser, never[] const users await em.find(User, {}); // 類型LoadedUser, identity | friends[] const usersWithRelations await em.find(User, {}, { populate: [identity, friends], });其內(nèi)部構(gòu)造typings.ts會(huì)遍歷實(shí)體屬性把 populate 提示中命中的關(guān)系屬性替換為L(zhǎng)oadedProp對(duì)LazyRef/Ref/Collection分別收窄并附加__loadedType、__loadHint標(biāo)記符號(hào)__loadHint利用逆變contravariance保證LoadedA, b不可賦值給LoadedA, b.c從而讓嵌套提示精確匹配。以下面的User實(shí)體為例含identity引用關(guān)系與friends集合關(guān)系defineEntity classimport { defineEntity, p } from mikro-orm/core; const UserSchema defineEntity({ name: User, properties: { id: p.integer().primary(), identity: p.manyToOne(() Identity).ref(), friends: p.manyToMany(() User), }, }); export class User extends UserSchema.class {} UserSchema.setClass(User);純defineEntityimport { defineEntity, p } from mikro-orm/core; export const User defineEntity({ name: User, properties: { id: p.integer().primary(), identity: () p.manyToOne(Identity).ref(), friends: () p.manyToMany(User), }, });reflect-metadata 裝飾器import { Entity, PrimaryKey, ManyToOne, ManyToMany, Collection, Ref, ref } from mikro-orm/core; Entity() export class User { PrimaryKey() id!: number; ManyToOne(() Identity, { ref: true }) identity: RefIdentity; ManyToMany(() User) friends new CollectionUser(this); constructor(identity: Identity) { this.identity ref(identity); } }ts-morph 裝飾器import { Entity, PrimaryKey, ManyToOne, ManyToMany, Collection, Ref, ref } from mikro-orm/core; Entity() export class User { PrimaryKey() id!: number; ManyToOne() identity: RefIdentity; ManyToMany(() User) friends new CollectionUser(this); constructor(identity: Identity) { this.identity ref(identity); } }用$做類型安全訪問(wèn)當(dāng)關(guān)系出現(xiàn)在Loaded提示中時(shí)即可通過(guò)$同步訪問(wèn)// 類型LoadedUser, identity const user await em.findOneOrFail(User, 1, { populate: [identity] }); // 類型安全的同步訪問(wèn) console.log(user.identity.$.email);沒(méi)有 populate 提示時(shí)訪問(wèn)$是編譯錯(cuò)誤// 類型LoadedUser, never const user await em.findOneOrFail(User, 1); // TS 錯(cuò)誤Property $ does not exist on type RefIdentity console.log(user.identity.$.email);$與get()的運(yùn)行時(shí)等價(jià)性由原型上的取值器保證Reference.ts類型層面則由LoadedReference接口typings.ts聲明$: NonNullableT與get(): NonNullableT。如果你不喜歡$這種魔法符號(hào)風(fēng)格可以直接用get()方法二者完全等價(jià)。在函數(shù)簽名中要求已加載關(guān)系可以把Loaded寫(xiě)進(jìn)函數(shù)參數(shù)讓編譯器替你把關(guān)function sendWelcomeEmail(user: LoadedUser, identity) { // 類型安全 —— identity 保證已加載 const email user.identity.$.email; mailer.send(email, Welcome!); } // 可行 —— identity 已被 populate const user1 await em.findOneOrFail(User, 1, { populate: [identity] }); sendWelcomeEmail(user1); // 編譯錯(cuò)誤 —— identity 未 populate const user2 await em.findOneOrFail(User, 1); sendWelcomeEmail(user2);集合的$訪問(wèn)$同樣適用于Collection// 類型LoadedUser, friends const user await em.findOneOrFail(User, 1, { populate: [friends] }); // 對(duì)已加載集合做類型安全迭代 for (const friend of user.friends.$) { console.log(friend.email); }集合側(cè)的收窄由LoadedCollection接口提供typings.ts額外支持getItems()便捷方法。注意Loaded純粹是編譯期構(gòu)造。你可以用類型斷言繞過(guò)它但那恰恰破壞了類型安全的意義。給RefT屬性賦值向RefT屬性賦值時(shí)需要先把實(shí)體包裝成引用import { ref } from mikro-orm/core; const book await em.findOne(Book, 1); // 方式一ref() 助手 book.author ref(someAuthor); // 方式二getReference 的 wrapped 選項(xiàng) book.author em.getReference(Author, 2, { wrapped: true }); // 方式三toReference() book.author wrap(someAuthor).toReference();ref(e)是wrap(e).toReference()的快捷方式二者等價(jià)于Reference.create(e)。wrap()的toReference()實(shí)現(xiàn)WrappedEntity.ts會(huì)緩存并返回一個(gè)Reference包裝器ref()的多態(tài)重載Reference.ts則兼容實(shí)體實(shí)例 / 實(shí)體類型主鍵 / 標(biāo)量值三種入?yún)⑿螒B(tài)。無(wú)需 EntityManager 地創(chuàng)建引用rel()在實(shí)體構(gòu)造函數(shù)內(nèi)部可以用rel()直接按主鍵創(chuàng)建裸引用defineEntity classimport { defineEntity, p, rel } from mikro-orm/core; const BookSchema defineEntity({ name: Book, properties: { id: p.integer().primary(), author: p.manyToOne(() Author).ref(), }, }); // 用法用作者引用創(chuàng)建 book const book em.create(Book, { author: rel(Author, authorId) }); export class Book extends BookSchema.class {} BookSchema.setClass(Book);純defineEntityimport { defineEntity, p, rel } from mikro-orm/core; export const Book defineEntity({ name: Book, properties: { id: p.integer().primary(), author: () p.manyToOne(Author).ref(), }, }); // 用法用作者引用創(chuàng)建 book const book em.create(Book, { author: rel(Author, authorId) });reflect-metadata 裝飾器import { Entity, ManyToOne, PrimaryKey, Ref, rel } from mikro-orm/core; Entity() export class Book { PrimaryKey() id!: number; ManyToOne(() Author, { ref: true }) author!: RefAuthor; constructor(authorId: number) { this.author rel(Author, authorId); } }ts-morph 裝飾器import { Entity, ManyToOne, PrimaryKey, Ref, rel } from mikro-orm/core; Entity() export class Book { PrimaryKey() id!: number; ManyToOne() author!: RefAuthor; constructor(authorId: number) { this.author rel(Author, authorId); } }另一種方式是用wrap()助手提供的toReference()const author new Author(...); book.author wrap(author).toReference();rel()內(nèi)部是Reference.createNakedFromPK(entityType, pk)Reference.ts——注意它創(chuàng)建的是裸實(shí)體引用不套R(shí)eference包裝因此非常適合在構(gòu)造函數(shù)/em.create這類還沒(méi)有 EntityManager 上下文的地方按主鍵占位。主鍵訪問(wèn)RefT類型天然包含實(shí)體的主鍵允許不加載直接讀取const book await em.findOne(Book, 1); console.log(book.author.id); // OK —— 主鍵總是可用MikroORM 按_id、uuid、id的順序探測(cè)主鍵屬性自定義主鍵名時(shí)使用PrimaryKeyProp符號(hào)聲明類型層實(shí)現(xiàn)見(jiàn) typings.ts 的Primary/PrimaryProperty探測(cè)邏輯defineEntity classimport { defineEntity, p } from mikro-orm/core; const AuthorSchema defineEntity({ name: Author, properties: { myPrimaryKey: p.integer().primary(), }, }); export class Author extends AuthorSchema.class {} AuthorSchema.setClass(Author); // 使用 defineEntity 時(shí) PrimaryKeyProp 會(huì)被自動(dòng)推斷純defineEntityimport { defineEntity, p, PrimaryKeyProp } from mikro-orm/core; export const Author defineEntity({ name: Author, properties: { myPrimaryKey: p.integer().primary(), }, }); // 使用 defineEntity 時(shí) PrimaryKeyProp 會(huì)被自動(dòng)推斷reflect-metadata 裝飾器import { Entity, PrimaryKey, PrimaryKeyProp } from mikro-orm/core; Entity() export class Author { PrimaryKey() myPrimaryKey!: number; [PrimaryKeyProp]?: myPrimaryKey; }ts-morph 裝飾器import { Entity, PrimaryKey, PrimaryKeyProp } from mikro-orm/core; Entity() export class Author { PrimaryKey() myPrimaryKey!: number; [PrimaryKeyProp]?: myPrimaryKey; }聲明之后自定義主鍵名即可直接訪問(wèn)// 現(xiàn)在自定義主鍵名也能用了 const book await em.findOne(Book, 1); console.log(book.author.myPrimaryKey);MongoDB 的雙主鍵形態(tài)對(duì) MongoDBidstring與_idObjectId同時(shí)可用defineEntity classimport { defineEntity, p } from mikro-orm/core; const BookSchema defineEntity({ name: Book, properties: { _id: p.type(ObjectId).primary(), id: p.string().serializedPrimaryKey(), author: p.manyToOne(() Author).ref(), }, }); export class Book extends BookSchema.class {} BookSchema.setClass(Book);純defineEntityimport { defineEntity, p } from mikro-orm/core; export const Book defineEntity({ name: Book, properties: { _id: p.type(ObjectId).primary(), id: p.string().serializedPrimaryKey(), author: () p.manyToOne(Author).ref(), }, });reflect-metadata 裝飾器import { Entity, PrimaryKey, SerializedPrimaryKey, ManyToOne, Ref } from mikro-orm/core; Entity() export class Book { PrimaryKey() _id!: ObjectId; SerializedPrimaryKey() id!: string; ManyToOne(() Author, { ref: true }) author!: RefAuthor; }ts-morph 裝飾器import { Entity, PrimaryKey, SerializedPrimaryKey, ManyToOne, Ref } from mikro-orm/core; Entity() export class Book { PrimaryKey() _id!: ObjectId; SerializedPrimaryKey() id!: string; ManyToOne() author!: RefAuthor; }const book await em.findOne(Book, 1); console.log(book.author.id); // string console.log(book.author._id); // ObjectId之所以兩種主鍵都能直接讀是因?yàn)镽eference構(gòu)造時(shí)會(huì)為實(shí)體元數(shù)據(jù)中的每個(gè)主鍵以及序列化主鍵serializedPrimaryKey注冊(cè)取值器Reference.ts。ScalarReference包裝器惰性加載的標(biāo)量屬性非關(guān)系使用ScalarRefTProperty({ lazy: true, ref: true }) passwordHash!: Refstring; Property({ type: json, lazy: true, ref: true }) metadata!: ScalarRefRecordstring, unknown;const user await em.findOne(User, 1); // 加載惰性標(biāo)量 const hash await user.passwordHash.load(); // 或直接 populate const userWithHash await em.findOne(User, 1, { populate: [passwordHash], }); console.log(userWithHash.passwordHash.$);對(duì)string、number這類原始類型RefT會(huì)自動(dòng)解析為ScalarReference對(duì)對(duì)象類型則需要顯式寫(xiě)ScalarRefT。這一分支邏輯體現(xiàn)在RefT條件類型定義中typings.tsT extends Scalar ? ScalarReferenceT : EntityRefT。ScalarReference的運(yùn)行時(shí)實(shí)現(xiàn)Reference.ts通過(guò)bind(entity, property)與宿主實(shí)體綁定load()內(nèi)部調(diào)用helper(entity).populate([property])走與關(guān)系 populate 相同的加載管線$/get()取值器直接返回標(biāo)量值Reference.ts??煽諛?biāo)量當(dāng)標(biāo)量引用可空時(shí)包裝器本身恒為真值需要在加載后檢查值Property({ type: json, nullable: true, lazy: true, ref: true }) config!: ScalarRefConfig | null;const entity await em.findOne(Entity, 1, { populate: [config] }); // 包裝器存在但值可能是 null if (entity.config.$) { // 這里可以安全使用 console.log(entity.config.$.setting); }小結(jié)按場(chǎng)景選擇正確的工具需求推薦方案顯式區(qū)分已加載/未加載接受.$間接訪問(wèn)RefTref: trueReference包裝器運(yùn)行時(shí)零包裝、只想要編譯期防護(hù)LazyRefTLoaded收窄在裸實(shí)體類型上直接load()/loadOrFail()Loadablemixin /LoadableBaseEntity無(wú)法穿透Loaded時(shí)的逃生通道unref()惰性標(biāo)量屬性非關(guān)系ScalarRefT對(duì)象類型需顯式聲明在構(gòu)造函數(shù)/em.create中按主鍵占位rel()/Reference.createNakedFromPK核心取舍一句話RefT用運(yùn)行時(shí)多一層包裝換運(yùn)行時(shí)與編譯期雙重安全LazyRefT用運(yùn)行時(shí)零成本換僅編譯期安全。兩者都依賴Loaded在類型層面追蹤 populate 狀態(tài)配合$同步訪問(wèn)器可以把空引用訪問(wèn)undefined這類運(yùn)行時(shí)錯(cuò)誤前移到編譯期。相關(guān)源碼與測(cè)試可繼續(xù)深入 packages/core/src/entity/Reference.ts、packages/core/src/typings.ts、tests/features/lazy-ref.test.ts 與 tests/bench/types/lazy-ref.ts。贊分享后端【免費(fèi)下載鏈接】mikro-ormTypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, MariaDB, MS SQL Server, PostgreSQL and SQLite/libSQL databases.項(xiàng)目地址https://gitcode.com/gh_mirrors/mi/mikro-orm點(diǎn)擊查看免費(fèi)下載相關(guān)推薦MikroORM 類型安全關(guān)系Type-Safe Relations實(shí)戰(zhàn)指南Reference、Loaded 與 LazyRef 完全解析MikroORM 類型安全關(guān)系Type Safe Relations實(shí)戰(zhàn)指南Reference、Loaded 與 LazyRef 完全解析 導(dǎo)讀 本文是后端MikroORM 7 類型安全關(guān)系Type-Safe Relations完全指南Reference、Loaded 與 $ 訪問(wèn)器MikroORM 7 類型安全關(guān)系Type Safe Relations完全指南Reference、Loaded 與 $ 訪問(wèn)器 MikroORM 7 的后端mikro-orm 類型安全關(guān)聯(lián)Type-Safe Relations從 Reference 包裝器到 Loaded 類型的實(shí)戰(zhàn)指南mikro orm 類型安全關(guān)聯(lián)Type Safe Relations從 Reference 包裝器到 Loaded 類型的實(shí)戰(zhàn)指南 本文以 mikro后端上一篇baoyu-slide-deck 幻燈片圖像生成提示詞規(guī)范基于 base-prompt 理解 The Architect 角色與 16:9 渲染管線下一篇AionUi Preview 模塊深度解析多 Tab 文件預(yù)覽編輯系統(tǒng)與 Agent 流式更新機(jī)制創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
影音先锋视频在线| 99在线免费公开视频| 啊啊啊啊啊啊在线看| 丁香九月 婷婷| 久久久国产精品亚洲精品| 色综合久久88色综合久久天天| 青草影院内射高潮| 久久久工口| 99999精品| 亚洲怡春院| 密臀在线免费观看| 欧亚在线视频| 无码视频一区二区| 色拍偷亚洲| 亚洲天堂区| 高清无码 国产精品| 国产女人视频三四五区| 午夜天堂精品久久久久91| 91视频成人福利网站在线一区 | 免费国产电影一区二区| 夜夜春夜夜操| 欧美国产日韩高清在线| 91另类| q2午夜理论片夜色av| 亚洲AV成人无码一区二区三区在线观看| 免费A V在线播放| 91 亚欧| 旡码电影特区| 综合五月婷婷| 91在线精品| 青青草久草| 亚洲A色| 在线性黄高清免费视频| 啪啪资源网| 亚洲精品97久久中文字幕| 欧美操逼视频二区| 久久久久13| 男女一进一出视频久久| 美女黄网| 人妻天堂网| 超碰一区二区| 天天舔天天日天天射| 国产污视频麻豆传媒一区二区| 亚洲中文一区二区三区| 大香蕉手机在线| 国产精品小视频一区二区三区| 国产精品免费美女视频| 国产人妻精品一区二区三区秋霞| 天天综合91在线| 精品国产精品一区二区| 国产精品懂色tv影视免费观看| 美女97超碰| 色婷婷影院| 久久精品国产亚洲AV成人直播| 天美传媒婬乱在| 色噜噜人妻av中文字幕| 中国和日本人色哪个不下载能放| 蜜屁Av| 久久久久久91香蕉国产| 91丝袜美女国产| 久久99热这里只频精品6学生| 岛国激情视频在线观看| 精品亚洲国产成人精品| 无码精品人妻一区二区三区妖精| 超碰97.com| 超碰 国产熟女精品一区| 99天堂网| 久久久久久AⅤ无码免费肉站| 91精品网站| 男人综合网| 欧美中字不卡| 天天色怡春院| 日韩精品一区,二区 九九...老司机| 91人妻视频在线| 亚洲免费精品一区| 亚洲91综合| 青草伊人网| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 久操操| 国产51色综合久久免费| 91高清无码下载| 亚洲性爱电影| 黄色网址在线免费观看| 日韩视频啪啪| 精品妇女一区二区三区| 丰满翘臀美女影院视频| 天堂精品在线| 久久色一区| 女人妻一区| 超碰午夜在线| 91综合天天| 丝袜美腿亚洲| 日日插夜夜| 国产亚洲精品农村妇女| 国产精品一区二区 尿失禁| 999岛国大片| 国产无马视频| 久久riav中文精品| 中文字幕在线观看丝袜| 婷婷五月天影院| 920日本午夜免费| 大屁股人妻女教师撅着屁股| 国产成年精品高清在线观看91| 视频不卡中文字幕| 亚洲男人天堂av| 精品999一区二区| AVE乱伦| 99久久久无码国产精品性啊聊| 欧美伊人电影| 家庭乱伦麻豆| 欧美午夜视频精品久久| 立川理惠加勒比无码| 东京热激情视频一二三区| 欧美五区| 97在线青| 黄色一区三区| 久久网亚洲| 男人久久天堂| 91痴汉| 天美av在线| 传媒在线观看一区二区三区| 国产无码精品成人| 亚洲成人一区二区精品| 最新欧洲欧美日本激情网站| 中文字幕-区二区三区四区视频中国| 一区二区三区国产精产| 精品人妻视频一区二区在线播放 | 中国91AV| 欧美性暴力| 无码逼| 国产按摩一区二区三区| 色综合加勒比四四季| 久久99999| 超碰97丝袜| 后入福利| 国产精品亚洲一区二区三区四区| 91美乳| 超碰色综合| 欧美自拍网| 91高清无码下载| 97色伦97色伦国产欧美| 超碰久超碰久| 香蕉热人人精品| 后入式五六区| 亚洲一区二区三区春色| 成人黑料社久久| 嗯嗯啊啊操死我| 九九人妻| 国产区日韩区在线观看| 一级A片女人高潮叫床| 视频分类 国内精品| 黄片com.| 蜜臀亚洲中文| 亚洲做性| 99热99在线播放激情| 久99久视频精选| 亚洲男人天堂2| 69麻豆天美| 日韩激情中文字幕有码| 国产热RE99久久6国产精品首| 97操操| 少妇内射www在线观看视频| 国产第11页| 91精品国产91久久青草| 日产欧美电影一区二区三区| 韩国三级理论在线| 91精品国久久久久久无码| 日本一二区不卡| 99久久精品无码一区二区毛片免费| 中日韩熟女| 天天做天天爱天天爽AV| 国产日本一区二区三区蜜臀在线观看| 免费国产电影一区二区| 九色 人妻 大香蕉| 日本熟妇精品九九| 欧美伊人久久综合网| 青青操狠狠撩| 人妻天天爽夜夜爽精品2| 天天综合网~91| 岛国片国产成人亚洲播放| 欧差乱伦二三| 国产Aα| 岛国黄色短视频| 麻豆视频国产一区二区| www.狠狠操| 国产综合永久精品日韩鬼片| 91色图片| 熟女天天干| 最近2019中文字幕国语免费版| 九九九九精品| 五月天激情婷婷| 久久爱超碰网| 老司机久久| 免费看黄片现成| 久久久久幕乱码| 黄色av一区二区在线| 精品久久久亚洲AV成人网站| 久草男人天堂| 最新一二三区视频| 综合婷婷| 夜夜国自区| 2025亚洲男人天堂| 亚洲人人夜夜澡人人爽| 99在线精品观看视频中文| 婷婷超| 欧美 亚洲 制服 精品| 99啪| 亚洲丝袜诱惑| 尹人大香蕉视频在线| 色拍偷亚洲| 思思热久久成人| 九色婷婷| 极品销魂美女一区二区 | 久久111| 91在线欧色| 亚洲精品一区中文字幕乱码| 国产不卡片| 91色鬼| 无码人妻精品一区二区三区九九| 五月婷婷激情网| 久久性爱城| 精品人体无圣光凹凸| 91c色| 亚洲欧洲日韩国产自在线| 久草尤物| 人人做天天爱| 日韩电影中文字幕| 黄色成年| 无码人妻精品一区二区三区99不卡| 亚洲欧美综合网站| 精品福利| 國產尤物AV尤物在線觀看| 色色色网站| 99re6国产精品99re在线| 日本丝袜美腿人妻九九| 中文字幕无码不卡啪啪| 91 综合网| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 97在线欧| 夜夜高潮夜夜爽夜夜爱爱一区| 亚洲 中文 欧美 日韩 在线| 亚洲天堂男人的天堂| 日韩免费a级毛片无码a∨| 日韩成人性爱AV| 91xingse| 久操 高清| 亚洲s在线观看| 午夜操操操| 91色花堂| 青娱乐日韩无码| 久久久久久九九九九-美女久久久久久久-成人AV | 欧美性爱18观看| 久久这里只精品免费福利| 国产成人+综合亚洲+天堂| 欧美v日韩v亚洲v最新在线| 日韩无码精品综合久久| 开心激情站| 亚洲欧美setu| 中文一区二区三区影院| 99精品久久| 日本99视频| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 成全在线观看免费观看| 91精品91久久久中77777| 91n美女视频| 狠狠97| 久久夜黄色无码A级大片| 天天干2019| 97综合激情| 精品国产乱码久久久久久久久久毛片| 长久操视频| 国产精品久久久久久久无码AV| 日韩一级久久毛片| 99热色这里只有精品| 午夜福利 成人 91| 性色A∨91| 最新日韩黄片| 欧美A√综合网| 丰满美女一级毛片在线播放| 伊人精品视频| 被男人吃奶很爽的毛片| 亚洲 中文 女同| 伊人久久蜜月| 97欧美性爱| 夜夜爽爽爽| 日本东京热大香蕉a片| 17c在线成人免费A片观看| 不卡九肏| 狠狠操一区二区| 欧洲久久一二线| 日韩av色图综合| 人人人人插| av资源在线播放天堂| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 日韩啪啪啪啪啪| 国产免费内射视频| 殴美大黄片| 97在线视频观看免费| 人妻少妇无码 | 亚洲天堂男人天堂网| 天天综和| 欧美午夜视频精品久久| 男人的天堂1024| 色性荡荡荡荡视频| 免费看黄片现成| 男人天堂.AB| 最新日日夜夜天天干干| 综合欧美日韩在线| 99操视频| 把腿张开老子CAO烂你| 97 国产精品| 亚洲第一综合| 夜夜嗨AV蜜臀av| AA级电影三区| 96麻豆精品一区二区三区| 欧美图片偷拍| 久久av无码| 激情视频一二三| 九九在线精品| 黑丝自慰喷水网站| 天天射天天操天天干天天吃2018| 婷婷在线播放| 黑人操一区二区| 麻豆成人AV| 蜜臀亚洲综合一二三四区| 性一交一乱一交A片久久四色| 1024午夜激情男人的天堂| 毛片一区二区| 精品国产乱码久久久久久久久久毛片| 日韩av乱伦| 伊人操| 欧美狠狠弄| 日韩av无码网站| 精品一区二区2| 久久久9视频| 国产亚洲精品农村妇女 | 久久久国产护士丝袜美腿一| 欧美久久毛片基地| 精品久久一区二区三区四区五区| 乱伦日本中文自拍| 欧美亚洲20p| 欧美伊人电影| 亚洲三级网址久久最新| 爽爽淫人网| 天天爱天天操| 伊人网一本| 国产白领连续中出在线播放| 欧美少妇熟女| 97九色人妻| 婷婷五月激情综合| 在线视频日韩欧美国产| 熟女少妇一区二区三区| 99精品在线| 99热超碰| 91oumei| 大香蕉92| 成人性爱av| 精品国产一级久久| 精品亚洲一区在线观看| 国产白丝精品在线观看| 日韩欧无码一区二区三区免费不卡| 九九久久精品| 天天日天天色| 成人午夜视频免费播放| 免费操逼视频下载| 免费毛片在线播放| 99色婷婷| 欧美狠狠弄| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 超碰久在线天天做| 97在线视频免费观看| 风月影院男女十八禁| 欧美亚洲清纯| 加勒比伊人综合| 97超碰精品成| 久久亚洲一区女同性恋中文字幕 | 91国产精品熟女| 黄色一级视| 免费亚洲黄色视频在线观看 | 亚洲 国产 精品一区| 91婷婷| 欧美一二三区四五区| 亚洲女人毛茸茸91| 97亚洲精品| 一级人妻性爱视频| 久操精品网| 国产精品网站www| 校园春色 亚洲| 国产精品人人爽人人做可爱福利| 欧美成人A√在线一区二区| 女人喷水视频在线观看| 国产又粗又又黄又猛| 国产精品久久久久久久久久久久久久久久 | 日韩欧美偷拍美女视频| 后入式福利| 人人看人人插| 男人夜色天堂ss| 国产精品在线一区二区| 欧州一区二区三区四区| 三级三久久线久久99久目本WW| 亚州精品人妻一二三区| 久操免费视频| 俄罗斯一区二区视频在线观看| 99精品欧美一区二区三区桃色| 十八禁成人网站在线观看| 青青草视频这里只有精品| 日韩97视频| 色y情视频免费看| 在线观看十八禁| 91四海无码日韩欧美| 国产精品激情久久久久久久| 欧美日韩人人早| 97久久久| 日韩美脚一区二区网站| 夜夜国自区| 久久少妇人妻| 欧美成人一级麻豆| 人摸人人操人| 99热这里只有精| 中文字幕第23区| 色97干| 精品成人亚洲午夜电影| 草蕉影视亚洲无码| 久久伊人亚洲AV无码网站| 又大又黄国产| 色逼综合| 亚洲色堂免费视频| 一起草三级AV电影在线观看| gogogo免费高清看中国国语| 精品免费1| 国产精品白虎| 日产操逼| 97国产色图| 欧美一级A一级a爱片久久| 久久国产精品91| 欧美色女人| 亚洲va综合va国产va中文| 欧美欧美少妇| 超碰三级秋霞| 1000部熟女视频在线观看| 97九色人妻| 天堂亚洲精品久久老牛| 91高清无码下载| 久久精品噜噜噜成人看免欧美大片| 国产午夜福利专区综合| 亚洲熟妇丝袜在线观看| 78精品| 久午视频| 黄色成品网站| 综合婷婷| 干婷婷综合网| 久久青青草原免费视频| 青娱乐淫乱1314| 啊啊啊啊啊啊在线| 婷婷五月天久久精品视频一区二区三区| 欧美成人A√在线一区二区| av2014 日韩在线中文字幕| 成人熟女视频一区二区三区| 香蕉久久国产AV一区二区| 啪啪啪精品视频| 97色亚洲| 91青青草| 日韩国产十八禁| 亚洲人久久久久日| 97色婷| 亚洲色图欧美激情| 超碰在97| 美女AV一区二区| av最新免费中文字幕| 欧美黑人168页欧美黑人167| 国产人伦精品一区二区三区| 亚洲Av无码成人精品国产| 极品色www影院| 使劲用力艹少妇视频一区二区| 天天爱综合网| 国产精品扒开腿做爽爽爽视频| 中文操逼字幕| 大香蕉日亚洲日本亚大| 丁香婷婷啪啪| 岛国激情视频在线观看| 欧美成人一区二区| 怡红院视频在线| 免费av大片| 日本中文熟女视频| 美女十八禁| 麻豆一区二区三区精品| 熟妇人妻精品一区二区视频色欲| 男女一进一出视频久久| 精品人妻一区二区三区不卡断| 嗯嗯嗯好爽| 91精品丝袜久久久久久无码人妻| 欧洲与亚洲欧美精品中文字幕| 翔田千里一区二区三区奶水| 色香欲影| 亚洲高清欧美总合| 偷拍亚洲视频一区二区三区四区| 大香蕉97久久| 99久热| 久9热| 99久在线精品99re8热| 欧美网站免费| 手机看片1025| 日韩黄色电影网站| 乱伦熟女区| 高清无码久操视频| 高清国产无码av| 综合伊人网12色| 国产品精品自在在线午夜免费| 丝袜狂射91| 色五月激情AV在线| 日韩人妻精品| www.人人摸在线视频| 99国产精品免费| 欧美A√综合网| 日欧毛片久久| 97天天插| 91欧| 亚洲美女av无码| 亚洲国产成人精品999| 日韩成人小视频| 欧美色图20P| 欧美日韩在线小说| 久久伊人亚洲AV无码网站 | 亚洲色婷婷综合久久久久中文| 精品小视频在线| 日日碰狠狠添天天爽超| 色色婷| 麻豆久久视频在线地址| 特级大荫道BBwBBwBBW| 老熟妇综合| 亚洲色图第四色| 成人小电影网站tex| 亚洲熟妇一,二,三期| 亚洲av性爱电影| 啊啊啊啊操死我| 国产成年精品高清在线观看91| 精品人妻一二三| 欧美综合娱乐久久| 操操吧亚洲乱伦视频| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 沈阳熟女高潮对白视频| 探花熟女,姿勢到位,體驗感也到位| 男人女人18禁片免费看网站| 91操熟女| 欧美日韩国产高清在线一二三区| 免费人成在线观看网站品爱网| 蜜乳AV免费观看| 亚洲古典另类欧美在线| 亚洲一二三精品久久网 | 黄久在线| 亚洲91色| 思思在线免费视频| 女一区二区| 后入精品| 无码精品人妻一区二区三区妖精| 深夜国产一区二区三区在线看| 操逼不卡中文字幕| www.色操逼| 国产精品区在线12p| 摸奶性爱视频网站在线免费播放| 人妻乱仑一区二区三区| 国产路线专区| 99精品无码| 翔田千里一区二区三区奶水| 亚洲第一页欧美| 欧美97色| 久久久久久亚洲精品中文字幕人妻| 91蜜桃传媒精品久久久一区二区| 亚洲图片婷婷五月天| 香蕉免费一区二区三区不读 | AV麻豆免费一区| 蜜桃久久久久久久| WWW啪啪的com| 欧美亚洲丝袜美女电影| 国产一级特黄大片处女| 日韩久草| 国产女人高潮视频| 三级精品三级在线观看| AV色图| 欧美亚性天堂| 亚洲无线码欧洲精品区别| 九热超碰| 欧美亚洲国内自拍| 欧美色图亚洲特色| 久久久久人妻二区精品叶可怜| 97超碰碰碰| 亚洲av综合伊人久久| 亚洲欧美91√| 亚州伊人色综台| www.色吧5.com| 天天日骚逼熟女| 神马久久久久眼| 国产区性爱在线视频秋霞豆| 91精品导航| 六月婷婷激情| 国产精品成人无码a v毛片| 欧美激情 一区| 亚洲欧美国产中文字幕| 超碰人人在线| 成人一区二区三区四区| 你想操日本小逼吗| 激情五月天校园春色网| 激情综合网五月婷婷五月天| 亚州少妇| 99热在线观看| 亚洲丝袜色| 午夜精品久久久久久久| 无码精品久久久天天影视| 狠插 制服 自拍| 日韩高清黄片| 丁香五月激情网| 色九久| 大香蕉啪啪网| 日韩精品啪啪啪| 亚殴在线| 国产精品高潮呻吟av久久4虎| 欧美顶级黄片AAAAA在线免费看 | 国产精品乱码久久| 色性欧美| 十八禁啪啪视频| 久操在97| 韩国成人精品久久久免费看| 精品国产乱码久久久久久网站入口| 久久精品噜噜噜成人看免欧美大片| 亚洲伊人a线观看视频| 午夜精品久久久久久久第一页按摩| 一区二区三区精品黑丝白丝酒店对鸡 | 婷婷15月天青娱乐| 久久久九97| 欧美成人性爱视频大全| 亚州欧美另类| 久偷拍欧美日韩三区| 中文字幕视频2区| AA级电影三区| 日夜伊人网| 啊啊啊 在线| 夜夜 中文视频rt| 性爱精品一区| 欧美一级黄片视频在线| 色盈盈影院| 熟女乱伦二区| 亚洲97综| 操熟女91| 成人性交午夜免费片| 欧美日韩97在线| 97伪v| 欧美性爱一区| 久久成年精品| 好爽,再快点啊哈嗯嗯嗯嗯| www.婷婷| 91neishe| 人人澡综合涩| 亚洲精品黑丝| 精品999一区二区| 视频在线观看一二三区| 蜜臀AV成人精品蜜臀AV久久| 欧美日韩青操| 一起草av| 在线人人人人人人精品超| 亚洲超碰97| 1240青青草一区二区三区视频天爱| 亚洲色资源| 国产视频一区二区三区久久亚洲天堂| 日韩一区二区三区四区五区| 99精品久久久久久久婷婷| 色99色| 亚洲宅男天堂| 久久久久久久一级黄色打同平台| 偷拍综合亚洲| 夜草欧美| 亚洲高清在线se| 男人天堂最新手机版在线青青草| 色九九综合| 日韩久久三区| 婷婷久久综合| 成人五月香网在线| 亚洲限制级在线| 欧美72网页| 啊啊啊啊啊舒服| 夜草欧美| 熟女熟妇一区二区三区视频| 91九色丰满高潮| 久久久无码国精品无码三区三区| 八戒午夜福利理论片| 欧美色综合网| 东京热毛片177b2viP| 色黄色美女大长腿午夜视频| 五月婷在线| 亚洲大胆人体av| 亚洲日韩天堂| 黑人操一区二区| 好湿好紧好爽 视频| 日韩综合第八区国产精品| 天天日天天干天天色| 操一区| 国产免费一区| 日本黄色裸日本黄色裸体| 欧美亚男人的天堂| 嫩草影院永久在线制服丝袜| 屌逼麻豆| 日本熟妇熟色97一本在线观看| 欧美亚洲高清不卡| 天天干天天干天天| 91丨九色丨熟女高潮| 久久97资源 网| 男人的天堂com| 国产黄色影片在线观看| 欧美另类综合久久| 97精品国产97久久久久久免费| 九九玖玖精品| 日韩无码AB| 日韩欧美麻豆| 天天草夜夜草高潮片| 久久久九九网站| 亚洲欧美一区二区三区在钱蜜桃| 久久久久久久久九九久孕交| 91熟女网| 久久久精品视频免费观看| 大香樵伊人网| 亚洲,欧美,综合网| 夜夜天天噜狠狠爱2021| 久久婷色| 亚洲熟女乱色一区二区三区久久久| 欧美色老汉| 国产一级作爱毛片| 99色在线| 亚洲一区制服诱惑| AV在线性爱| 好吊色在线观看| 丝袜天堂网| 免费超碰97久久| 国产精品人妻一区二区| 亚州伊人色综台| 欧美韩日精品99综合| 亚洲 自拍偷拍 欧美| 免费的av网| 97在线免费看视频| 婷婷综合网| 中文字幕精品三级久久久| 国产自产自拍| 久久欧洲| 色波多| 色香色香欲天天天影视综合网| 青娱乐大香蕉| 成人一道本免费视频| 伊人久久亚洲中文字幕| 亚洲激情视频| 性爱av在线免费观看| 91最新综合| 久久久久亚洲| 少妇 综合| 97视频在线播放| 人人操人人大香蕉| 96AV久久久| 国产精品人妻无码久久久互動交流| 免费的黄片wwwwww| 懂色av中文字幕| 久久无码电影| AV男人天堂网| 青青草依人大香蕉| 欧亚性爱视频免费看| 欧美在线|亚洲| 在线国产一区二区av| 尤物av网站| 成人性爱免费播放| 久久女人视频| 精品欧美不卡在线播放| 1024亚洲中文字幕久在线看片你懂的| 欧美日韩精品青青| 日本精品第一视频在'| 你草精品在线视频| 日韩综合成人免费视频| 哈哈操电影AV| 51久久夜色精品国产麻豆| 亚洲麻豆精品二区三区| 国产一区在线看| 精品夜夜澡人妻无码| 狠狠爱大香蕉| 美女自卫慰黄网站免费| 综合久久99亚洲人妻中文在线| 大肥女高潮bbwbbwhd视频| 六月色色| 人人妻人人玩人人澡人人爽| 啊啊啊com| 日本黄大片在线观看视频| 91操人| 蜜桃av色偷偷av老熟女| 四月丁香婷婷| 国产强奸91| 久久夜精品一区二区三区| 黄片无码在线制服| 欧美精品91| 久久亚洲AV无码专区国产精品| 美女毛片999| 福利在线观看一区二区| 欧美日韩亚洲少妇寂寞影院正在播放| 国产熟女免费观看久久| 亚洲骚男同com| a网站免费观看| 97国产精品视频| 97视频7| 首页中文字幕中文字幕免费| 欧美精品久久| 亚洲综合伊人无码久久| 粉嫩国产精品久久粉嫩| 国产精品久久久久久久AV大片| 亚洲AV资源| 欧美精品日韩久久久九| 国产熟码AV| 美女超碰978| 一区二区三区亚洲| 好色美女九七第一页| 一道本久久棕合爱| 国产乱伦亚洲色图高清无码| 九一国产精品| 久久麻豆一区二区| 欧美偷拍区| 超碰在线综合97| 日本久久精品| 亚洲熟伦熟妇AV无码春色| 男人精品天堂一区| 中文字幕 码精品视频网站| 家庭乱伦麻豆| 嗯嗯啊啊的视频| 久久精视频美日韩在线视频| 78精品| 你草精品在线视频| 91Chinese在线| 亚洲AV成人精品网站在AV| 超碰午夜| 国产亚洲禁久一区二区| 天天看天天日天天操| 91丨精品丨国产丨丝袜| 亚洲色五月| 日逼逼免费看| 高清孕妇孕交 交| 亚洲欧美一区二区三区在钱蜜桃| 放黄片放3级黄片没穿衣服| av东京热男人的天堂| 狠狠色婷婷7777久| 久操精品| 日本免费一区二区不卡| 香蕉99秘 精品一区丁香| 大色综合网| 岛国免费视频在线| 日韩精品三级| 岛国黄| 大奶的诱惑| 中出后入| 一二三啪啪专区| 中文字幕精品一区二| 97色欧洲| 久久理论字幕视频| 国产亚洲综合欧美一区| 囯产精品久久久久久久久久二区三区| 夜夜操91744565| 熟女突然公开看18禁影片| chaopen97久久| 日韩午夜国产| 久久久蜜桃一区二区三区| 国产无吗在线播放| 日日不卡av| 99这里都是精品| 国产高清不卡视频| 久久久久成人蜜桃精品| 一类无码操逼视频| 日本孕妇一区二区视频操逼免费看| 亚洲色香| 九久9热| 亚洲色欲天天人妻无码系列专区| 亚洲 暴爽 AV人人爽日日碰| 国产97综合| 东京热av男人的天堂| 欧美第一页性| www.激情| 婷婷视频在线免费观看| 成人av福利在线观看| 欧美一区二区| 激情四射婷婷六月天| 色色99| 十八禁网站在线| 激情五月天婷婷| 色色色色网站| 伊人五月天激情| 青青操网| 夜夜嗨一区| 亚州色阁| 国产精品久久久777| 嗯嗯啊啊操死我| 色欧美天天| 日韩成人综合网| 精品无码少妇| 国产三级中文字幕粉嫩 | 色色无码| 黑人黄片在线免费观看| ..日韩av毛片精品久久久| 日韩免费中文字幕视频| 火箭成精品视频884必出精品| 操一区| 天天综合影院91| 亚洲情色1区| 综合色图,成人综合网| 久久久婷| 欧美色色色| 天堂种子在线www网资源| 天天日B夜夜干B时时操B| 亚洲日韩精品久久久久一区壹牛| 国产精品日日摸天天碰| 俺去啦自拍| 97国产精品久久久久| 老司机午夜精品福利视频一区二区| 真实高潮91| 淫淫总合网| 欧美.亚洲.另类.丝袜.制服.诱惑| 国产日韩欧美三级片| 国产强奸91| 亚洲无码太久| 黄色人人| 亚洲日韩美国人妻| 精品偷拍13p欧美dodk视频| 艹精品| 日韩一级久久毛片| 26uuu最新| 亚洲性爱成人| 人人做,人人操,人人摸| 欧美性爱免费短视频| 大香蕉中文| 亚洲啪啪综合?v一区综合精品区| 国产不卡的视频 | 国产激情av女片自拍| 欧美大香蕉久| 情趣丝袜无码操逼视频| 91白虎| 亚洲欧美不卡线| 免费精品无码一级毛片牛牛影视 | 黑人综合网| 欧美亚洲综合高清在线| 91老熟妇| 老司机深夜18禁污污网站| 午夜激情成人在线观看| 91在线免费精品视频| 翔田千里爆乳巨臀无码| 秋霞Av理论一级在线| 日韩av在线精品观看| 欧美性爱免费短视频| 日韩成人精品| 国产精品美女久久久久AⅤ国产馆| 国产午夜精品理论片a大结局| 亚洲国产精品无石码久久| av网站在线看| 一级特黄aaa大片在线观看成人一级片在线观看| 国产乱伦性爱区| 日韩亚洲国产视频| 尤物一级在线免费观看| 人妻av在线| 俺去也婷婷| 看黑人AV不卡| 天美精品一区二区三区四区在线观看| 九九九网页| 亚州久久9| 在线播放中文字幕| 男人的天堂网页| 亚洲欧洲中文日韩女优乱码| 人人人干干人人干| 无码逼| 亚洲日韩精品在线播放| 精品一区二区成人动漫| 久/久精品99看9| 97蜜桃综合| 老女人老91妇女老热女| 亚洲一区二区中文字幕| 日韩欧美亚洲自拍偷拍| 97啪啪| 曰韩中文人妻视频| 成人激情无码在线视频| 婷婷激情综合网| 日韩熟女精品无码专区一区二区| 亚洲最大的黄色电影网站。| 精品中文日韩字幕视频| 天天欧美| 亚洲图片欧美| 久久久久免费看少妇A片特黄| 成人麻豆av电影网站| 亚洲欧美碰碰| 人人干黄色| 无码伊人久久大杳蕉中文无码| 91在线无码精品秘 软件| 青青操97| 蜜桃狠狠色伊人亚洲综合 | 另类视频在线| 精品美女少妇一区二区| 亚洲精品一二牛牛| 色综合九九| 欧美激情 日韩精品| 欧美综合自拍亚洲综合图| 成人午夜高潮av猛片| 黄视频免费| 色噜噜综合网| 大香蕉啪啪啪啪在线| 久久久久久九九九九九| 欧美黄色大片在线观看| 女人爽到高潮久久久| 97精品国产精品免费观看| 91亚洲狠狠色| 自拍偷拍国产欧美日韩韩| 亚洲夜夜欢无码一区二区 | 色99999| 凸凹视频在线观看| 99∨VTV| 久久 亚洲 日韩 人妻| 老熟乱一区二区三区四区| 久久久久久久九九九九九九| 熟女精品一区二区三区| 亚洲欧美日韩电影网站一区| 超碰97护士| 国产亚洲国产超碰| 北京美女一区二区| 久久久久夜夜夜夜| 亚洲夜夜欢无码一区二区| 欧美日韩精品国产91| 好吊色青靑草| 国产 丝袜 欧美中文 另类| 欧美精品99久久久| 亚洲色悠悠久久88| 中文不卡视频| 国产极品美女高潮无套在线观看| 9久久精品| 操91| 人人看人人插| 少妇 综合| 97超级久久| 十八禁的黄污污免费网站| 蜜臀久久久久久999| 欧美成va视频网站| 日本999精品| 日韩免费在线观看不卡| 色五月婷婷五月天| 亚洲欧美日韩有码| 欧美激情综合| 久碰视频| 91超碰丝袜制服| 激情小说成人日本无码一| 超碰97资源大奶| 久久免费9| 99综合免费视频| 亚洲精品国产熟女久久久| 亚洲丝袜诱惑| 中文字幕精品一区二区精| 综合日韩激情另类图片| 国产97综合| 夜嗨影院| 91大神电影天堂| 欧美综合色,www| 成人性爱全视频观看| 精品一国2| 国产精品毛片?v一区二区三区| www.99视频| 亚洲好色人妻| 国产高清成人传媒影视| 亚洲综合夜色| 欧美亚洲| 亚洲男人天堂2013| 日韩综合无码色欲vv| 97超碰国产精品| 玖玖久久久| 五月丁香综合网| 国产久久天堂资源| 中文字幕jul-617人妻熟女| 亚州精品人妻一二三区| 探花熟女,姿勢到位,體驗感也到位| 欧美综合97www| 久久久新亚洲AV| 亚洲欧美一区二区三区在钱蜜桃| 中文字幕在线第二页| 免费操逼视频下载| 色哟哟精品1精品2| 免费看黄视频亚洲网站| 无码欧美有限公司| 91春色| 欧美色图偷拍另类| a片久久久久久久久久久久| 男人的天堂在线2| 强被迫伦姧在线观看无码网站| 九月婷婷| 日日夜夜免费| 大香蕉手机在线视频| 欧美99999| 91伊人影视综合| 日本操逼视频不卡直接放| 中国黑人三级片网站上区| 四虎国产精品永久地址入口| 中国小夫妻勾搭露脸淫荡对白| 蜜臀久久99精品久久久久久-DVD| 色婷视频| 色爱天堂| 国产白丝精品在线观看| AA丁香综合激情| 国产97亚洲| 亚洲国产一区二区三区在线| 久久有码视频| 国产精品色| WWW.操逼.COM| 私色综合网| 久久久一区二区三区四区五区| 色色色综合网| 亚洲精品九九九| 日本一二三高清| 爽极品影院| 顶级少妇BT天堂| 国产传媒操逼视频| 熟妇高潮二区三区| caorenqi shipin| 国产在线视频午夜精华在| 台湾佬中文娱乐自偷自拍| 青娱乐欧美激情一区二区| 久久人人爽爽爽人久久久| 日本免费一级AAA大片器| 国产传媒美日韩av| 国产福利在线视频网站| 东京热不卡视频| 秋霞一级视频在线观看免费| 欧美国产成人在线| 亚洲精品97中文字幕| 无码国产精品午夜不卡(| 日欧毛片久久| 无码区蜜乳| 熟女熟妇伦久久影院毛片一区二区| 国产操逼逼网| 国产精品伦理| 国产成人网| 蜜臀一区二区三区在线| 亚洲欧洲第二视频在线观看色图| 亚洲欧美在线观看无码| 中文字幕免费看| 久久精品一区二区三区不卡| A级片日韩欧美国产欧美视频精选观看| 欧美中文字幕男人天堂久久精品| 国产激情在线| 天天操天天插| 大学生美女口爆| 日韩资源网| 日本在线不卡v二区| 国产视频97| 国产不卡片| 少妇高潮对白在线观看| 成人性交午夜免费片| 亚洲情色91| 国产成年精品高清在线观看91| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 九九色热| 久久精品一区二区一8| 日韩 欧美 校园一区| 九九色影院| 国产精品黑人一区二区三区| 208天天久久九九九| 日本天天吊| 另类TS人妖一区二区三区| 91欧美少妇| 少妇六月天| 五月天婷婷久久|