色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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
返回資訊列表
9色国产精品一区粉嫩 | 精品中文日韩字幕视频| 三级AV入口| 蜜臀无码一区二区| 99国内精品| 一区操逼日比视频| 91天天看| 天天干人人乐| 蜜桃色院一区久久 | 无码操逼网| 日产精品久久久一区二区| 亚洲天堂女优在线 | 婷婷伊人| 一起草精品人妻| 日韩在线97| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 日韩少妇丰满亚洲| 色婷婷激情| 日韩精品国产一区二区| 中文字幕一区二区三区字幕| 女上位精品在线| 一区二区首页| 夜夜国产一区| 国产偷仑| 日韩 欧美 国产 麻豆| 9久久9综合| 床上啊啊啊一区二区三区| 黄片com.| 久久国产视频性吧| 久久天天性久久伊人| 天天欧美欧美亚洲网| 婷婷91| 伊人色综合网电影| 全球成人中文在线| 激情综合网五月婷婷| 日本五十路熟女一区二区| 色色婷婷丁香| 久久理论字幕视频| 密臀在线免费观看| 330dv亚洲成年视频网| 精品一区96| 青青草久久一区网| 大香蕉在线SuP| 色噜噜日韩精品| 2017天天插| 试看60秒 爽| 亚洲天堂区| 精品射1999| 色综合久久夜色精品国产天堂| 精品十三区| 97欧美色综合| 欧美一二三| 久久精品久久九九精品| 婷婷综合五月| 久久人妇| 中文字幕在线免费观看2| 澳门黄片一香蕉视频| 一区二区影院| 91 国产丝袜在线放观看| 色偷偷色偷偷欧美日韩| 一级性爱视频免费观看 | 久久人人看| 中文字幕91综合| 亚洲素人综合| 欧美性爱免费短视频| 天天色播| 情色大香蕉| 久久久国产av美女私房| 久久99综合| 成人熟女区| 中文字幕在线免费观看2| 熟女精品va中文字幕| 欧美在线官网| 人人弄人人摸| 日本精品人妻少妇一区二区| 国产综合久久久麻桃个| av九九| 欧美一区二区情色| 一级特级aaaa毛片免费观看 | 日韩传媒在线| 国产亚洲深夜激情| 亚洲欧美一区二区不卡视频播放| 欧美一区二区三区互相| 青青草久久一区网| 热无码中文亚洲H一道本一区二区| 嗯嗯啊中文字幕| 易易A毛视频| 日本亚洲熟女视频| 在线观看中文字幕| 亚洲蜜臀懂色| av天堂5| 91美女视频直播| 免费综合亚洲中文| 性色AV网站| 神马久久久久久久久久久久| 少妇3P性爱自拍| 208天天久久九九九| 日本久久天堂| 日婷婷| 国产精品69久久久久孕妇欧美| 黄色区免费观看中文字幕| 操老熟女AV| 激情五月婷| 丁香九月 婷婷| 深夜激情| 欧美一区二区三区黄色影视| 九九热男人天堂| 天天插夜夜操| 五月丁香激情四射| 五月天久久人妻| 第一高清av中文字幕| 五月激情综合网| 伊人黄色片| 国产美女高潮视频| 中文字幕精品乱码| 日韩精品三区四区| 乱伦熟女区| 亚洲欧美不卡线| 少妇熟女视频一区二区三区 | 骚货| 色婷婷丁香五月| 国产精品一级特黄aaa大片在线观看| 乱色老一区二区三区的观看方式| 五月天久久婷婷亚洲| 极品丝袜无码| 操人妻少妇中文 | 日韩视频小说在线观看| 蜜桃久久久久久久| 91扒丝袜综合在线| 亚洲天堂另类美腿| 男人的天堂成人的社区| AND人妻系列| 1956日韩精品| 熟女人妻av在线资源,黄色的资源 粉嫩国产精品久久粉嫩 | 精品国产一区二区三区久久久蜜臀 | 久久成年片色大黄全免费网站| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 刺激精品视频| 久九干| 少妇天堂网络| 欧美视频第二页| 日韩AV中文字幕电影| 青青五月天| 人妻喷水| 免费人成毛片乱码| 99在线免费公开视频| 26uuu欧美日韩| 高清无码 国产精品| 国产 无码 一区二区| 入口操逼网站| 色综合色色| 91高跟美女在线播放| 少妇内射www在线观看视频| 色综合20p| 欲香欲色综合天天伊人| 看大黄色大片原件| 丁香五月成人| 乱欲性色| 男人的天堂2019| 亚洲色图欧美色图日韩色图| 国产亚洲一黄| 超碰97导航| 亚洲色图综合| 久久亚洲婷婷| 久久一二三四五六七八九区| 综合av社区| 2011国产精品| 漂亮人妻被强中文字幕hd| 1000部熟女视频在线观看| 超97在线精品视频| 天天日天天屌天天操| 欧美色图亚洲色| 国产女性无套 免费观看| 欧美熟妇视频 | 国产精品美女在线一区| 黑人天8A∨高清网站| 精品视频日日夜夜| 曰韩精品九九无码| 神马久久久久久久久| 高潮毛片无遮挡高清免费| 亚州国产精品乱| 一级免费精品| 五月综合色| 色香欲天天天天综合色| 日人妻视频91| 密臀成人视频久久久| 亚洲日韩美女中文字幕乱| 日日A∨| av毛片aaaaa免费看| 成 人 影视 一区 二区 三区 四区 | 欧美色图99| 女人午夜视频777| 成人精品欧洲亚洲| 日本欧美国内在线| 国产白丝av| 久久大香蕉手机高清| 日本国产亚洲一区在线观看| 亚州综合AⅤ| 操逼操网| 91成人18| 成人精品视频| 大香交伊人网| 亚洲日韩美国人妻| www.男人的天堂| 久插综合| 综合天天。| 超AV色女| 日本色婷婷| 女人与公拘交酡2020视频| 国产亚洲精品美女| 成 人 影视 一区 二区 三区 四区 | 大香蕉亚洲中文| 在线αⅴ| 亚洲图片第一页| 性性久久| 怡红院怡春院| 久久精品人体| 黄色小视频日本txt| 校园春色亚洲| 人妻熟妇一区二区三区| 99精品久久久久久| 色大香蕉97N| 午夜久久一区二区无码中出| 99性视频| 日本 欧美 国产一区| 欧洲综合无码| 国产福利一区二| 欧美色网络| 亚洲第一页综合在线| 免费亚洲国产精品久久一区| 亚洲欧美综合色| 少妇蜜汁| xxx亚洲午夜天堂| 久草国产在线视频| 国产精品美女视频诱惑| 天天综合网91| 欧美v日韩v亚洲v最新在线| 久草毛片| 男人的天堂 在线一区| 人妻少妇精品久久久久久| 老鸭窝成人| 97综合激情| 水滴偷拍| WWW操逼| 18啪啪手机免费性爱| 国产又黄又爽又刺激久久久久久| 日韩欧美成人午夜福利| 99综合| 加勒比av中文| 欧美极品女人的天堂| 欧美激情综合| 亚洲综合99999| 1204av韩国| 中文字幕一区二区三区蜜桃视频| 亚洲风情综合网| 91 丝袜在线播放| 在线可观看的黄色网址| 丝袜美腿制服人妻二区中文字幕 | 91挑色欧美| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 日本黄 R色 成 人网站| 国产丝袜美女诱惑| 色九九九九九九| 国产精品久久久| 在线岛| 天天日天天舔天天喷天天射| 蜜臀久久99精品| 精品78| 户外裸露刺激视频第一区| 日韩久久三区| 日韩天天综合| 亚洲av无线观看| 亚州综合电影| 加勒比综合| 色色婷婷丁香| 国产天天噜一噜久久久| 亚洲无吗在线视频| 伊人网在线视频| 美女天天干| 伊人天堂在线| 91五十路| 久久婷婷色综合一区二区三区| 久偷拍欧美日韩三区| 人人操人人搞人人草| 99激情视频| 一本道综合色图| 欧美在线干| 亚洲 欧美 偷拍 唯美| 亚洲伊人久久精品狠狠在线| 97国产精品视频| 亚洲宅男天堂| 高清无码久操视频| 精彩国产视频播放1区2区| 久久午夜色播影院免费高清| 97资源超碰| 日日爱99| 精品乱码在线观看| 人妻少妇av在线观看| 91天天综合在线| 五月天色色网站| 蜜臀久久99精品久久久久久婷婷| 国产av尤物| 欧美日韩大香蕉| 色97| 尤物网站91| 啊啊好多水| 手机在线观看不卡无码av| 欧美亚洲清纯| 色哟哟-国产专区| 久久一区二区高清免费| 午夜一区| 久久成人午夜狠狠| 熟女一区二区| 日本精品第一视频在'| 97免费在线观看视频| 国产老熟女| 秋霞视频一区二区| 国产探花日韩援交| 国产一二三在线视频五十路| 熟妇高潮一区二| 夜夜爽爽爽| 久久九九国产精品| 大香蕉一区二区在线观看.| 亚洲骚男同com| 最新亚洲风情电影| 久久久精品电影| 久久九九精品一区二区 | av天堂加勒比| 激情文学小说一区二区| 欧美日动态视频| 天美传媒av 在线| 色欲天天综合网| 户外裸露刺激视频第一区| 国产在线强奸视频| 国产黄色影片在线观看| 亚洲国产一级黄色视频| 在线视频亚洲无码| 久久精品一区二区三区四区五区| 九九九免费视频| 麻豆亚洲AV成人无码久久精品| 天操天操夜操夜月操月年年操操| 欧美97视频| 91高潮喷水美女| 中文字幕伊人| 激情欧美97| 国产精品剧情| 国产女s强制榨精视频| 翔田千里A片一区二区| 激情婷婷综合久久| 日韩av免费一级电影| 国产日韩区| 国产成人综合在线播放| 久久亚洲中文字幕视频| 亚洲?V无码专区在线电影| 久久久久久亚洲中文| 欧美人妻久久精品二区三区| 狠狠干,狠狠操| 日本亚洲vr欧美不卡高清专区| 日韩三级网址| 人人操人人精品影片| 欧美色网| 色婷五月| 嗯~啊~快点 死我视频免费看网站| 九热超碰| gogogo免费高清看中国国语| 激情五月天丁香社区| 18禁看网站一区| 一级久久性爱视频| 亚洲AO在线| 狠狠色五月亚洲91| 日韩精品 视频一区二区| 色色99| 在线观看午夜婷婷久久久久清性观看| 67914在线兔费成人视频| 天天草天天日| 九九Av| 久久久熟女一区| 在线αⅴ| 国产农村妇女精品一二区| 男人的天堂三级| 一起草日韩| 国产AV人人 夜夜人人澡| 精品久久久久久久| 婷婷99| 麻豆天美在线| 久久久精品成人国产| 欧美天堂第二区| 91被操| 免费看污网站| 乱伦a片视频| 欧美暴力猛交| 91强热人妻| 色拍偷亚洲| 国产情侣自拍在线播放| 丝袜美腿91| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 人人操人人大香蕉| 老熟女综合网| 欧美大香蕉在线观看| 国内精品嫩模A∨私拍小视频| 东京热激情视频一二三区| 国产精品视频在线观看| 超碰激情808| 亚洲一区二区三区不卡国产欧美| 天天综合网~91综合网| 亚洲高清无码免费观看视频| 国产在线能看的你懂的| 中出在线视频| 熟女激情综合网| 青青欧美| 熟女人妻av在线资源,黄色的资源| 欧美中文综合| 日本999精品| 欧美精品99久久久| 成人免费看吃奶视频网站| 偷拍欧美亚洲| 麻豆人妻少妇在线免费观看| 麻豆这里只有精品| 日本羞羞的视频在线播放| 亚洲鸥美色图| 北京专精特新企业招聘信息| 久久精品三级影视| 亚洲色欲天天天堂色欲网女| 久久精品28| 亚洲色图国产另类| 九九热五区| 69人妻精品一区二区绯色| 国产最新小视频在线播放下载| 素人伊尹大香蕉免费下载视频| 校园春色欧美色图| 97超级久久强资源| 91狠| 欧美色五月| 国产一级作爱毛片| 精品视频免费在线一区| 国产二区视频在线观看电影| 日韩成人高清一区二区| 亚洲色狠| 91亚洲欧美| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 日韩AV一区二区三区四四| 欧美视频边做饭边橾| 欧美的性爱网站免费| 午夜福利一区二区影院| 日本性感人妻91| 少妇熟女1区2区3区| 97爱爱| 大香蕉丝袜一级片| 99在线视频播放| 北京专精特新企业招聘信息| 国产人妻精品久久久一区二区三区| 欧美日韩成人在线| 久久手机视直播| 男人的天堂成人的社区| 91精品人妻啪啪间| 欧洲一区二区| 一区在线精品中文字幕| 成人无码在线视频网站| 午夜操逼不卡| 人妻久久久久久| 97se综合网| 成人区人妻精品一| 黄色免费网| 18禁网站在线播放| 91国产丝袜足交精品视频| 99精品热| 欧美色女人| 岛国大片在线观看网站入口| 新版天堂中文资源8在线| 久久伊人五月天| 操一区| 亚洲少妇激情一区二区三区| 久久久久大香青草精品综合| 国产女上位好爽在线| 天天躁日日躁xxxxx| 日本欧美一区二区三区免费| 日韩欧美亚洲自拍偷拍| 蜜臀AV一区二区三区| 成人性爱高清视频免费看| 美女主播色欲91抠b在线播放| 国产精品一二三区18| 久久久啊啊| 欧美日本视频一区| 国内毛片无码一级毛片| 97这里有精品| 人妻天天爽夜夜爽爽| 91精品国产91综合久久蜜臀| 九九九久千久久激情蜜桃在线看 | 精品人妻视频入口| 天天日天天屌天天操| 亚洲黄色a级片| 亚洲天在线| 极品五月天噜噜| 操逼无码操逼| 997色在线| 九九热在线精品视频| 国产成人在线观看网址| 亚洲中文电影| 欧美丰满熟妇XXXX性ppX人交| 色区97| 亚洲情色1区| 亚洲va有码在线天堂| 情色大香蕉| 五月天色图影视| 成人97人人超碰人人| 超碰社区97| 精品久久久久,69国产成人精| 久久午夜鲁丝片| 曰本道人妻久久久在线不卡色视频 | 99热精品青草在线| 97任你吞精| 亚洲无线观看久久| 99999亚洲另类| 亚洲淫乱骚妇AV| 日韩精品中文字幕二区| 综合久久久久久久久91| 狠久久| 大香蕉综合久久| 丁香五月激情五月| 久久久精品无码亚免费| 久久草草亚洲蜜桃臀| 日韩有码回春沙龙第一页| 九久9热| 久久婷婷亚洲| 欧美十八禁导航成人| 夜夜爽夜夜操| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 中文人妻av高清一区| 精品国产乱码久久久久久久| 亚洲限制级| 久久国色天香香蕉| 九九综合久久| 国产精品视频精品一二| 欧美丰满少妇xx高潮| 91综合色| 亚洲日韩电影| 日韩精品亚洲一二三| 涩涩久久精品| 久久久久久波多野吉衣高潮| 色综合潮| 啊嗯好大视频在线观看| 精品一区二区啪啪啪| 欧美顶级黄片AAAAA在线免费看| 欧美探花网| 亚洲乱码精品一区二区| 亚洲日韩国产精品| 91情色| 麻豆久久一区二区三区| 丝袜足交视频| 久久精品久| 蜜臀久久久99久久久久 | 欧美熟女妇同| 青青草十区九区爱夜| 久草久热| 成年男人的天堂| 中文字幕在线观看第二页| 亚洲AV无码天美传媒一区| 婷婷色婷婷| 五月婷婷综合在线| 91蜜臀熟女| 欧美不卡在线美女| 欧美日韩淫加| 天天天天天超碰| 91精产一区二区三区| 国产精品一区二区后入| 福利天天都操| 久久加勒比| 97在线观看| 国产精品视频91久久| 国产无码精品高清| 婷婷影院入口| 99久久久久| 三级三级三级日本99| 亚洲美乱| 亚洲色图国产另类| 国产97综合| 玖玖久久久| 岛国A V在线免费看| 成人a大片在线观看| 爆操无码| 久久大香蕉手机高清| 操人妻逼91| 日本好吊色视频| 97超碰精品图片| 天天色图| 国产欧美一级在线观看| 久热无码| 91精品婷婷国产综合久久竹菊| 欧洲亚洲综合| 老熟女91| 粉嫩av在线一区二区| 久久丁香五月天| 中文字幕乱碼在线| 无码精品啪啪啪一区二区三区三州| 国产成人五月天丁香花| 国产亚洲日韩欧| 五月婷婷激情网| 亚洲AO在线| 女人18精品一区二区三区| 激情小说亚洲| 久久AV无码网址| 丰满人妻一区二区三区在线| 国产av色网| 97无码视频在线播放| 日韩欧美国产高清视频| 亚洲男人天堂网久久| 亚欧操逼片在线观看 | 看免费的黄片| 久久久久免费少妇| 夜夜青青无码影院| 亚洲无码超碰免费| A V少妇特黄三级| 欧美中字不卡| 伊人黄色片| 97色在线观看| 日韩欧视频| 中文字幕aⅴ在线视频| 91丝袜在线观看视频在线观看| 99色在线| 秋霞无码av鲁丝片一区| 欧美五区| www.av家庭乱伦| 亚洲久热| 99re99在线视频| 欧美日韩性爱无码| 人妻少妇色综合| 激情小说日韩无码| 久久久99久9| 中文字幕在线免费观看| 久热九九| 欧美同性恋 的搜索结果 - 91n| 精品成人亚洲午夜电影| 九九热超碰97亚洲最新香蕉| 超碰在线一区二区| 青青草中文-久久青草精品一区二区三 | 牛牛久久国产精品视频一二三 | 九九热免费国产视频婷婷伊人五月 | 日本ZZ高免费A级视频| 成年人性爱日韩| 天综合网欧美| 久久精品国产亚洲AV无码做| 婷婷15月天青娱乐| 国产精品呦一区二区三区| 天天看特黄的免费网站| 无码免费在线观看黄色片| 亚洲色图加勒比| 爱妃国产亚洲视频中文字幕| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 欧美伊人电影| 亚洲中文字幕av| 少妇精品| 国产精品老熟女一区二区| 亚洲图片第一页| av中文字幕在线熟女| 婷婷色综合欧美日韩| 人妻在线臀日韩| 天天懆天天日| 精品久久艹| 伊人久久大香大香线蕉中文| 黄色工厂这里只有精品| 嗯嗯啊中文字幕| 国产偷拍网站| 青青草乱入乱欲视频在线观看| 亚洲最大成人a毛毛片| 国产自产22区| 五月天综合在线| 啪啪视频免费在线观看| 日本999精品视频| 伊人五月天激情| 久久久久久十| 日韩一级二级在线| 男人高清无码一区二区| 天天色综合影视网| 人妻夜夜爽天天爽麻豆三区网站| 国产精品ⅴ无码大片在线看.| 欧美在线视频播放| 狠狠综合网| 91久久久亚洲| 四虎在线免费视频| 国产伦精品一区二区三区视频女| 18禁在线视频| 一区二区三区四区五区久久久久久| 天天干,天天日| 欧美一二三级精品在线| 热热色青青草| 久久亚州高清| 桃花色涩综合影院| 操逼视频国产无套| 夜夜嗨TV| 亚洲吊色| 一本一道人妻久久一区二区三区 | 熟妇高潮一区二| 久色网| 在线岛| 青青草福利视频| 久久人人爽av亚洲精品天堂桃色 | 天美传媒婬乱| 亚洲天堂一二| 91N综合在线| 欧美日韩性感| 91|九色|国产熟女| se01国产在线视频| 久久大黄片| 欧美在线大香999| 国产不卡中文字幕免费avi| 免费观看的av| 国产精品香蕉热久久新品| 无遮挡又黄又刺激的视频| 欧美综合综合| 黄色片G G G| 欧美大香蕉97| 无码99| 99色色网| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | A男人的天堂| 麻豆av一区二区三区| 久久激情五月| 欧美三级中文字幕hd| 午夜乱轮操逼视频免费看| 欧美色女人| 欧美色另类| 小电影欧美91| 人妻人久久精品中文字幕| 久久伦理视频久久大香蕉视频| 成年男人的天堂| 97人肏| 韩日精品四区| 人妻少妇精品一区二区三区| 五月婷婷激情网| 性爱av网站| 性爱乱伦一区| 亚洲蜜桃V妇女| 1024人妻熟女一区二区三区| 少妇高潮特黄A片| 亚洲va有码在线天堂| 人人操人人摸人人看人人插| 午夜福利一区二区影院| 国产亚洲精品A在线观看下载| 麻豆久久精品亚洲精品88| 不卡在线观看视频| 亚洲天堂男人| 亚洲一区中文精品| 国产传媒午夜理伦精品| 熟妇xxxxx性春色| AV和黑人在线播放| 成人八戒网站| 精品成人av一区二区三区在线| 黄片无码在线制服| 日韩无码专区| 狠狠欧美| 91美女视频在线| 欧美天堂超碰97| 欧美一区二区三区成人性生活| AV色五月天| 全国男人天堂网| 日本不卡在线二区三区| 日本不卡二区| 少妇啪啪自拍| 人人操人人狠狠操| 精品久久久久,69国产成人精| 欧美久久草熟女| 磁力99AV| 久久激情视频| 极品销魂美女一区二区| 免费少妇一区二区| 国产色呦呦| 嗯啊不要在线观看嗯啊| 超碰97色色| 国产丝袜高跟美女av免费观看| 婷婷激情丁香| 极品销魂美女一区二区| 金莲网址| 久久久人体| 综合欧美日韩在线| 99热这里都是精品| 亚洲AV秘无码一区..| 日韩成人精品视频自拍| 亚洲天堂中文字幕无码男同| 国产午夜视频| 国产sv美女内射| 国内精品a| 丁香五月天堂网| 久久精品老司| 国产日韩怡红院| 欧美激情性爱视频网站| 五月天婷婷色| 欧美亚洲se91| 久久久久国产精品久久久| 约操熟妇| 亚洲丝袜B诱惑| 蜜臀99久久精品久久久久久| www.99色| 一区二区三区精品黑丝白丝酒店对鸡| 九九久久国产精品| 欧美日韩色| 欧美经典一区二区三区| 日韩亚洲美州欧洲综三区一品在线| 1204av韩国| 久操免费在线| 精品人妻美妇91job| 综合网亚| 欧美精品三级黄片| 日本福利二区视频| 一区,二区,三区视频| 久久久久久久97| 手机看片1025| 久久精品电影| 国产AV色黄看到爽| 欧美最婬乱婬爆婬性视频 | 2020中文在线一区二区三区| 成人综合色网| 综合网少妇| 国产强奸超碰AV| 综合91网| 北约熟女超碰| 麻豆性爱视频在线播放| 亚洲男人天堂网| 日日干夜夜干| 日韩欧美三级| 婷婷丁香五月激情啪啪| 大香蕉色欲AV| 国产福利在线视频网站| 日日AV加勒比| 88xx成人精品视频| 日本三级日本三级三级人妇四虎| 人人操人人肉久久精品| 婷婷久久网| 久热精品在线| 国产免费永久精品无码| 91超碰丝袜制服| 国产树林里野战在线看| 青青草久久| 久久精品中文字幕无码l| 国产一区二区三区,在线观看观看 五月开心久久AV官网 | 日韩人成网站在线播放| 91欧美性| 久久精品国产亚洲AV无码电影| 330dv亚洲成年视频网| 亚洲天天做日日做天天谢日日| 激情文学 国产一二三aV| 天堂69亚洲精品中文字| 夜夜騷av、一區二區| 最新国内自拍av免费| 区二区亚洲婷| 夜间福利片1000无码| 午夜久久久| 久久亚洲婷婷| 国产精品扒开腿做爽爽爽视频| 麻豆天美国美国产AV| 97视频在线| 色91综合网| 亚洲图片激情综合另类| 青青操视频在线| 麻豆这里只有精品| 九九九网站| 成人久久无码www| 操B在线观看| 欧美亚州综合网图片| 中文字幕日韩综合| 极品欧美一区二区三区| 综合91网| 日本99久久| 欧美日韩国产成人高清| 97精品97| 色婷婷综合网站| 国产女同在线观看视频| 久久久∴| 99热婷婷| 久久久久亚洲熟妇熟女| 加勒比av官网在线| 长长久久免费视频| 操www| 999热日韩精品| 日韩伦理久 久久 清纯| 无码av永久免费专区网站| 78m啪啪啪| 久久久网一区| 色99色| 操逼天美3区| 综合亚洲欧美| 国产精品丝袜久久亚洲不卡| www久久久| 嗯啊视频免费在线观看| 91制服丝袜| 丝袜性亚洲| 国产在线精品偷| 欧美人人操人人插| 传媒在线观看一区二区三区| 东北女人| 欧美久久九九| 在线性黄高清免费视频| 日本孕妇一区二区视频操逼免费看 | 色噜噜狠狠色综无码久久合欧美| 1204av韩国| 久久久精品国产亚洲伊人| 午夜无码精品免费看性色| 香蕉欧美| 大逼色网站| 国产乱码久久久久久| 91人妻视频在线| 超碰人人色| 亚洲成?V人片在线观看福利| 日韩性爱小视频| 色区97| 欧美色图97| 欧美成人色| 五月天色图| 成人资源中文字幕在线观看天天| 最新的亚洲无吗| 在线岛国新天堂8| 色综合一区二区三区| 又黄又硬又粗又长国产视频| 新视频sss国产| 你草精品在线视频| 厕所偷拍在线| 欧美色三级片91| 性爱久久| 在线99热| 久久这里只精品99re66图| 温婉少妇玩3p| 乳欲人妻办公室奶水| 国产亚洲精品久久久久小| www国产无码| 97超碰站| 久久天堂| 91免费看一区二区三区 | 一区二区三区 丝袜 高跟 美腿| 亚洲欧美经典一区二区| 国产乱码精品一区二区三区四川| 国产在线视频二区| 国模私拍一区二区三区神乳| 人妻精品免费一二三区| 秋霞怕怕片| 人人摸人人入| 国产二区三区免费视频| 中日韩一区二区三区欧美| 人人搞人人插人人操| 成人五月天丁香激情综合| 久久久中文| 一中国女人毛片水真多| 国产免费黄色一级大片| 一级婬片120分钟试看| 国产超碰AV在线精品| ,成人免费啪啪视频| 色黄污美女啪啪啪免费网站| 日本人妻中文字幕| 思思热国产在线视频| 亚洲AV无线| 亚洲AV成人无码一区二区三区在线观看 | 啊好爽受不了无码| 天天看特黄的免费网站| 亚洲涩涩| 日日AAvv| 精品国产乱码久久久A| 在线观看中文字幕| 成人av福利在线观看| 啪啪AV导航| 国产精品午夜高潮呻吟久久av| 爱射综合| 超碰 97国产熟女| 丝袜综合| 97在线观看免费| 91 丝袜在线播放| 久久久精品91八戒| 国产精品视频白浆免费| 色五月综合| 吉田爱美AV在线| 精品9999| 亚洲欧美综合| 黄色一区二区秘书性感| 啪啪综合网| 伊人丝袜美腿高跟在线观看高清 | 手机看片1024你懂的国产| 男人的天堂不卡一区二区| 日产中文字幕2020| 日韩特一级久久| 97精品| 92午夜免费福利视频| 精品夜夜澡人妻无码| h色99999| 国产精品久久久久久久久久久久| 色婷婷六月丁香七月婷婷| 日本亚洲熟女视频| 爱干爱射网啊啊啊| 骚鸭AV| 性爱综合一区二区| 91性高潮久久久久久久久| 性色中出| JuliaAnnXXX888| 自拍偷拍亚洲熟女妇人精品| 99视频内射三四| 中出789在线视频| 少妇无码999| 国产免费操逼| 午夜呻吟欧美| 亚洲春色欧美| 国产精品黄色三级av| 日本超碰在线国产一区| 大香蕉92| 免费一级精品啪啪视频| 亚洲有码 欧美精品| 人妻大香蕉| 一区二区三区免费视频入口| 欧美日综合| 欧美激色| 日本成人A片网站| 日本伦理一区二区| 欧色网址| av片在线观看免费播放| 福利天堂| 91P0RNY大屁股人妻| 婷婷综合视频| av2014 日韩在线中文字幕| 91在线视频观看国产| 欧美性暴力猛交XXXX| 综合97| 天天爽夜夜操| 日韩天天综合| 亚洲色图亚洲无码强奸乱伦| m欧洲一级午老| 欧美日韩大香蕉| 久9久| 欧美亚洲天堂| 色综合美国| 亚洲色图欧洲| 尹人大香蕉视频在线| 可乐操亚洲蜜911| 日本欧美国内在线| 蜜臀99久久精品| 在线观看精品国产免费| 香蕉大久久久| 女人喷水视频在线观看| 98福利在线视频| 91久久精品中文字幕| 九九九九欧美| 欧美日韩国产高清在线一二三区 | 欧美一级A片不卡视频。| 午夜欧美神马久久久久| 99久久精品欧美国产| 91最新综合| 日韩中文字幕视频| 91骚妇| 18禁中文字幕| 超碰一区二区| 99re国产中文字幕| 国产精品另类| 天天添天天干电影| 精品人妻一区二区三区日产乱码| 69人妻人人揉人人躁人人精品| 亚洲天堂一区| 欧美三级免费伊人| 在线观看无码三级少妇| 超碰午夜| 综合色图区| 久久久精品| 日本一天色道久久久精品视频| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 午夜福利免费精品视频| 国内精品久9| 啊啊啊操一区| 91一区二区三区蜜桃| 亚洲天堂日本| 五月丁香综合啪啪| 国产福利合集| 久久99999| 欧亚在线视频| 国产女人视频三四五区| 日本啊啊啊啊啊视频| aaaa少妇高潮大片| 欧美性91| 91国产美女丝袜足交精品视频| 日韩人妻 中文字幕| 久草免费在线视频| 又摸又舔在线观看网站| 久久‘黄片视频| 97精品久久| 欧美超碰人妻97| 亚洲 日本 一 二 三| 日欧操屄| 亚州高清AV| 成人精品视频一区二区| 免费A V在线播放| 97色亚洲| 亚洲国产中文字幕| 成人夜夜爽| 中文字幕日韩人妻视频一区二区三区| 日本精品加勒比海一区| 一区麻豆 高清中文字幕| 强奸乱伦动态污图免费 | 激情五月婷婷综合| 亚洲一区操| 日本韩国五十路六十路七十路老熟女作爱视频网站 | 青青欧美在线| 日韩性爱电影一区| 襙一襙| 精品人妻久久久| 超碰夫妻97| 一品道视频一区二区三区| 午夜偷拍久久熟女| JIZZJIZZ亚洲女人被躁| 欧美天天影院| 欧美成人综合| 又大又长又爽| 97在线精品| 精品一区二区成人| 少妇一级无码精品| 色色九区| 久久久久久中文| 91天射| 怡红院怡春院| 午夜精品久久久久久久男人的天堂| 夜夜影视四色| 草莓精品视频在线免费观看| 久久春色| 日日夜夜骑| 亚洲成人在线资源| 日韩无码久久熟女一级片| 人人摸人人干| 人人乐大香蕉| 先锋影音av先锋一区| 国产精品熟女九九九| 久久伊人五月天| 午夜寂寞欧美| www.91逼逼.com| 另类小说综合网| 午夜男女爽爽大片免费观看| 美女网站91| 欧美亚州综合网图片| 91劲爆| 亚欧美综合网。| 秋霞午夜视频一区二区| 日韩久久超碰色| 亚州成人A√| 少妇毛片久久| 蜜臀AV一区二区三区激情综合| 亚州色交| 性色一线| 久热久一区二区三区| 久久精品欧美一区蜜桃| 蜜臀久久一区二区| 国内91熟女人妻丝袜天天精品视频在线 | 欧美性生活男人的天堂| 日本孕妇一区二区视频操逼免费看 | 97硬碰| 91成人在线| 午夜欧美神马久久久久| 美欧老女人97| 国产第二页| 黄色av播放免不| 婷婷精品久久av影视| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 国产成人无码啪| 0755午夜福利视频| 午夜噜噜噜| 女优大全 - 91n| 亚洲欧美日韩中文播放| a男人的天堂久久一级A毛片| 99久久精品欧美国产| 在线欧美69V免费观看视频| 99久久精品无码一区二区|