ObjectRepository - .NET āĻ‡āĻ¨-āĻŽā§‡āĻŽāĻ°āĻŋ āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦāĻžāĻĄāĻŧāĻŋāĻ° āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻœāĻ¨ā§āĻ¯

āĻ•ā§‡āĻ¨ āĻ¸āĻŦ āĻ¤āĻĨā§āĻ¯ āĻŽā§‡āĻŽāĻ°āĻŋāĻ¤ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŦā§‡āĻ¨?

āĻ“āĻ¯āĻŧā§‡āĻŦāĻ¸āĻžāĻ‡āĻŸ āĻŦāĻž āĻŦā§āĻ¯āĻžāĻ•āĻāĻ¨ā§āĻĄ āĻĄā§‡āĻŸāĻž āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻŦā§āĻĻā§āĻ§āĻŋāĻŽāĻžāĻ¨ āĻŽāĻžāĻ¨ā§āĻˇā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻ‡āĻšā§āĻ›āĻž āĻšāĻŦā§‡ āĻāĻ•āĻŸāĻŋ SQL āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻŦā§‡āĻ›ā§‡ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻžāĨ¤ 

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ•āĻ–āĻ¨āĻ“ āĻ•āĻ–āĻ¨āĻ“ āĻŽāĻ¨ā§‡ āĻ†āĻ¸ā§‡ āĻ¯ā§‡ āĻĄā§‡āĻŸāĻž āĻŽāĻĄā§‡āĻ˛ SQL āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤ āĻ¨āĻ¯āĻŧ: āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻŦāĻž āĻ¸āĻžāĻŽāĻžāĻœāĻŋāĻ• āĻ—ā§āĻ°āĻžāĻĢ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻœāĻŸāĻŋāĻ˛ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ• āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ 

āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ–āĻžāĻ°āĻžāĻĒ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻšāĻ¯āĻŧ āĻ¯āĻ–āĻ¨ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻĻāĻ˛ā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻāĻ•āĻœāĻ¨ āĻ¸āĻšāĻ•āĻ°ā§āĻŽā§€ āĻœāĻžāĻ¨ā§‡āĻ¨ āĻ¨āĻž āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻĻā§āĻ°ā§āĻ¤ āĻĒā§āĻ°āĻļā§āĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧāĨ¤ āĻ†āĻĒāĻ¨āĻŋ N+1 āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻ¸ā§‚āĻšā§€ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻ•āĻ¤ āĻ¸āĻŽāĻ¯āĻŧ āĻŦā§āĻ¯āĻ¯āĻŧ āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨ āĻ¯āĻžāĻ¤ā§‡ āĻŽā§‚āĻ˛ āĻĒā§ƒāĻˇā§āĻ āĻžāĻ¯āĻŧ SELECT āĻāĻ•āĻŸāĻŋ āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ¸āĻ™ā§āĻ—āĻ¤ āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ¯āĻŧ?

āĻ†āĻ°ā§‡āĻ•āĻŸāĻŋ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻšāĻ˛ NoSQLāĨ¤ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ• āĻŦāĻ›āĻ° āĻ†āĻ—ā§‡ āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡āĻ° āĻšāĻžāĻ°āĻĒāĻžāĻļā§‡ āĻ…āĻ¨ā§‡āĻ• āĻšāĻžāĻ‡āĻĒ āĻ›āĻŋāĻ˛ - āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ• āĻ‰āĻĒāĻ˛āĻ•ā§āĻˇā§āĻ¯ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¤āĻžāĻ°āĻž MongoDB āĻŽā§‹āĻ¤āĻžāĻ¯āĻŧā§‡āĻ¨ āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ json āĻ¨āĻĨāĻŋāĻ° āĻ†āĻ•āĻžāĻ°ā§‡ āĻ‰āĻ¤ā§āĻ¤āĻ° āĻĒā§‡āĻ¯āĻŧā§‡ āĻ–ā§āĻļāĻŋ āĻ›āĻŋāĻ˛ (āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ—āĻ•ā§āĻ°āĻŽā§‡, āĻ¨āĻĨāĻŋāĻ¤ā§‡ āĻŦā§ƒāĻ¤ā§āĻ¤āĻžāĻ•āĻžāĻ° āĻ˛āĻŋāĻ™ā§āĻ•āĻ—ā§āĻ˛āĻŋāĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ•āĻ¤āĻ—ā§āĻ˛āĻŋ āĻ•ā§āĻ°āĻžāĻš āĻĸā§‹āĻ•āĻžāĻ¤ā§‡ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛?).

āĻ†āĻŽāĻŋ āĻ…āĻ¨ā§āĻ¯, āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻāĻŋāĻšā§āĻ›āĻŋ - āĻ•ā§‡āĻ¨ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻŽā§‡āĻŽāĻ°āĻŋāĻ¤ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĄā§‡āĻŸāĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž, āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻ•ā§āĻ°āĻŽā§‡ āĻāĻŸāĻŋāĻ•ā§‡ āĻ°ā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŽ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœā§‡ (āĻĢāĻžāĻ‡āĻ˛, āĻ°āĻŋāĻŽā§‹āĻŸ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸) āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŦā§‡āĻ¨? 

āĻŽā§‡āĻŽāĻ°āĻŋ āĻ¸āĻ¸ā§āĻ¤āĻž āĻšāĻ¯āĻŧā§‡ āĻ—ā§‡āĻ›ā§‡, āĻāĻŦāĻ‚ āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ›ā§‹āĻŸ āĻāĻŦāĻ‚ āĻŽāĻžāĻāĻžāĻ°āĻŋ āĻ†āĻ•āĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯ā§‡ āĻ•ā§‹āĻ¨āĻ“ āĻ¸āĻŽā§āĻ­āĻžāĻŦā§āĻ¯ āĻĄā§‡āĻŸāĻž 1 GB āĻŽā§‡āĻŽāĻ°āĻŋāĻ¤ā§‡ āĻĢāĻŋāĻŸ āĻšāĻŦā§‡ā§ˇ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ†āĻŽāĻžāĻ° āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻšā§‹āĻŽ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ†āĻ°ā§āĻĨāĻŋāĻ• āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻžāĻ°, āĻ¯āĻž āĻĻā§ˆāĻ¨āĻŋāĻ• āĻĒāĻ°āĻŋāĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ¨ āĻāĻŦāĻ‚ āĻ†āĻŽāĻžāĻ° āĻ–āĻ°āĻš, āĻŦā§āĻ¯āĻžāĻ˛ā§‡āĻ¨ā§āĻ¸, āĻāĻŦāĻ‚ āĻĻā§‡āĻĄāĻŧ āĻŦāĻ›āĻ°ā§‡āĻ° āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ā§‡āĻ° āĻ‡āĻ¤āĻŋāĻšāĻžāĻ¸ āĻ°āĻžāĻ–ā§‡, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° 45 MB āĻŽā§‡āĻŽāĻ°āĻŋ āĻ–āĻ°āĻš āĻ•āĻ°ā§‡āĨ¤)

āĻĒā§‡āĻļāĻžāĻĻāĻžāĻ°āĻ°āĻž:

  • āĻĄā§‡āĻŸāĻžāĻ¤ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ¸āĻšāĻœ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ - āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĒā§āĻ°āĻļā§āĻ¨, āĻ…āĻ˛āĻ¸ āĻ˛ā§‹āĻĄāĻŋāĻ‚, ORM āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯āĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻšāĻŋāĻ¨ā§āĻ¤āĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¨āĻž, āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ C# āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĻ¨;
  • āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻĨā§āĻ°ā§‡āĻĄ āĻĨā§‡āĻ•ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ āĻ•ā§‹āĻ¨ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¨ā§‡āĻ‡;
  • āĻ–ā§āĻŦ āĻĻā§āĻ°ā§āĻ¤ - āĻ•ā§‹āĻ¨āĻ“ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ¨ā§‡āĻ‡, āĻ•ā§‹āĻ¨āĻ“ āĻ•ā§‹āĻ¯āĻŧā§‡āĻ°āĻŋ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻ•ā§‹āĻĄā§‡āĻ° āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻ¨ā§‡āĻ‡, āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° (āĻĄāĻŋ)āĻ•ā§āĻ°āĻŽāĻŋāĻ•āĻ•āĻ°āĻŖā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨ā§‡āĻ‡;
  • āĻ¯ā§‡āĻ•ā§‹āĻ¨ āĻ†āĻ•āĻžāĻ°ā§‡ āĻĄā§‡āĻŸāĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻ—ā§āĻ°āĻšāĻŖāĻ¯ā§‹āĻ—ā§āĻ¯ - āĻ¤āĻž āĻĄāĻŋāĻ¸ā§āĻ•ā§‡āĻ° XML-āĻ āĻšā§‹āĻ• āĻŦāĻž SQL āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡, āĻŦāĻž Azure āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ-āĻāĨ¤

āĻ•āĻ¨āĻ¸:

  • āĻ…āĻ¨ā§āĻ­ā§‚āĻŽāĻŋāĻ• āĻ¸ā§āĻ•ā§‡āĻ˛āĻŋāĻ‚ āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ—ā§‡āĻ›ā§‡, āĻāĻŦāĻ‚ āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻļā§‚āĻ¨ā§āĻ¯ āĻĄāĻžāĻ‰āĻ¨āĻŸāĻžāĻ‡āĻŽ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻ•āĻ°āĻž āĻ¯āĻžāĻŦā§‡ āĻ¨āĻž;
  • āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ•ā§āĻ°ā§āĻ¯āĻžāĻļ āĻšāĻ˛ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻ‚āĻļāĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻĄā§‡āĻŸāĻž āĻšāĻžāĻ°āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ (āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ•āĻ–āĻ¨āĻ‡ āĻ•ā§āĻ°ā§āĻ¯āĻžāĻļ āĻšāĻ¯āĻŧ āĻ¨āĻž, āĻ¤āĻžāĻ‡ āĻ¨āĻž?)

āĻāĻŸāĻž āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡?

āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§‚āĻĒ:

  • āĻļā§āĻ°ā§āĻ¤ā§‡, āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĄā§‡āĻŸāĻž āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ;
  • āĻāĻ•āĻŸāĻŋ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻŽāĻĄā§‡āĻ˛, āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ¸ā§‚āĻšā§€ āĻāĻŦāĻ‚ āĻ°āĻŋāĻ˛ā§‡āĻļāĻ¨āĻžāĻ˛ āĻ‡āĻ¨āĻĄā§‡āĻ•ā§āĻ¸ (1:1, 1:āĻ…āĻ¨ā§‡āĻ•) āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ;
  • āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻĒā§āĻ°āĻĒāĻžāĻ°ā§āĻŸāĻŋ (INotifyPropertyChanged) āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŦāĻ‚ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšā§‡ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻ¯ā§‹āĻ— āĻŦāĻž āĻ…āĻĒāĻ¸āĻžāĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻŦāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ (INotifyCollectionChanged);
  • āĻ¯āĻ–āĻ¨ āĻ¸āĻžāĻŦāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒāĻļāĻ¨āĻŸāĻŋ āĻŸā§āĻ°āĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻŦāĻ¸ā§āĻ¤ā§āĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœā§‡ āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻžāĻ°āĻŋāĻ¤ā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ;
  • āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻ—ā§āĻ˛āĻŋ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻ•ā§āĻ°āĻŽā§‡ (āĻāĻ•āĻŸāĻŋ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°ā§‡) āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻžāĻ•āĻ—ā§āĻ°āĻžāĻ‰āĻ¨ā§āĻĄ āĻĨā§āĻ°ā§‡āĻĄā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ;
  • āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻ–āĻ¨ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻ•āĻ°ā§‡āĻ¨, āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻ—ā§āĻ˛āĻŋāĻ“ āĻ¸āĻžā§āĻšāĻ¯āĻŧāĻ¸ā§āĻĨāĻžāĻ¨ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŋāĻ¤ āĻšāĻ¯āĻŧā§ˇ

āĻ•ā§‹āĻĄ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ

āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¤āĻž āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

// ОŅĐŊОвĐŊĐ°Ņ йийĐģиОŅ‚ĐĩĐēĐ°
Install-Package OutCode.EscapeTeams.ObjectRepository
    
// ĐĨŅ€Đ°ĐŊиĐģиŅ‰Đĩ Đ´Đ°ĐŊĐŊŅ‹Ņ…, в ĐēĐžŅ‚ĐžŅ€ĐžĐŧ ĐąŅƒĐ´ŅƒŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒŅŅ иСĐŧĐĩĐŊĐĩĐŊиŅ
// ИŅĐŋĐžĐģŅŒĐˇŅƒĐšŅ‚Đĩ Ņ‚Đž, ĐēĐžŅ‚ĐžŅ€Ņ‹Đŧ ĐąŅƒĐ´ĐĩŅ‚Đĩ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒŅŅ.
Install-Package OutCode.EscapeTeams.ObjectRepository.File
Install-Package OutCode.EscapeTeams.ObjectRepository.LiteDb
Install-Package OutCode.EscapeTeams.ObjectRepository.AzureTableStorage
    
// ОĐŋŅ†Đ¸ĐžĐŊĐ°ĐģŅŒĐŊĐž - ĐĩŅĐģи ĐŊŅƒĐļĐŊĐž Ņ…Ņ€Đ°ĐŊиŅ‚ŅŒ ĐŧОдĐĩĐģŅŒ Đ´Đ°ĐŊĐŊŅ‹Ņ… Đ´ĐģŅ Hangfire
// Install-Package OutCode.EscapeTeams.ObjectRepository.Hangfire

āĻ†āĻŽāĻ°āĻž āĻĄā§‡āĻŸāĻž āĻŽāĻĄā§‡āĻ˛ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻŋ āĻ¯āĻž āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻŦā§‡

public class ParentEntity : BaseEntity
{
    public ParentEntity(Guid id) => Id = id;
}
    
public class ChildEntity : BaseEntity
{
    public ChildEntity(Guid id) => Id = id;
    public Guid ParentId { get; set; }
    public string Value { get; set; }
}

āĻ¤āĻžāĻ°āĻĒāĻ° āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻŽāĻĄā§‡āĻ˛:

public class ParentModel : ModelBase
{
    public ParentModel(ParentEntity entity)
    {
        Entity = entity;
    }
    
    public ParentModel()
    {
        Entity = new ParentEntity(Guid.NewGuid());
    }
    
    public Guid? NullableId => null;
    
    // ПŅ€Đ¸ĐŧĐĩŅ€ ŅĐ˛ŅĐˇĐ¸ 1:Many
    public IEnumerable<ChildModel> Children => Multiple<ChildModel>(x => x.ParentId);
    
    protected override BaseEntity Entity { get; }
}
    
public class ChildModel : ModelBase
{
    private ChildEntity _childEntity;
    
    public ChildModel(ChildEntity entity)
    {
        _childEntity = entity;
    }
    
    public ChildModel() 
    {
        _childEntity = new ChildEntity(Guid.NewGuid());
    }
    
    public Guid ParentId
    {
        get => _childEntity.ParentId;
        set => UpdateProperty(() => _childEntity.ParentId, value);
    }
    
    public string Value
    {
        get => _childEntity.Value;
        set => UpdateProperty(() => _childEntity.Value, value
    }
    
    // ДоŅŅ‚ŅƒĐŋ Ņ ĐŋОиŅĐēĐžĐŧ ĐŋĐž иĐŊĐ´ĐĩĐēŅŅƒ
    public ParentModel Parent => Single<ParentModel>(ParentId);
    
    protected override BaseEntity Entity => _childEntity;
}

āĻāĻŦāĻ‚ āĻ…āĻŦāĻļā§‡āĻˇā§‡, āĻĄā§‡āĻŸāĻž āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻ•ā§āĻ˛āĻžāĻ¸ āĻ¨āĻŋāĻœā§‡āĻ‡:

public class MyObjectRepository : ObjectRepositoryBase
{
    public MyObjectRepository(IStorage storage) : base(storage, NullLogger.Instance)
    {
        IsReadOnly = true; // ДĐģŅ Ņ‚ĐĩŅŅ‚Ов, ĐŋОСвОĐģŅĐĩŅ‚ ĐŊĐĩ ŅĐžŅ…Ņ€Đ°ĐŊŅŅ‚ŅŒ иСĐŧĐĩĐŊĐĩĐŊиŅ в йаСŅƒ
    
        AddType((ParentEntity x) => new ParentModel(x));
        AddType((ChildEntity x) => new ChildModel(x));
    
        // ЕŅĐģи иŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Hangfire и ĐŊĐĩОйŅ…ОдиĐŧĐž Ņ…Ņ€Đ°ĐŊиŅ‚ŅŒ ĐŧОдĐĩĐģŅŒ Đ´Đ°ĐŊĐŊŅ‹Ņ… Đ´ĐģŅ Hangfire в ObjectRepository
        // this.RegisterHangfireScheme(); 
    
        Initialize();
    }
}

āĻāĻ•āĻŸāĻŋ ObjectRepository āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨:

var memory = new MemoryStream();
var db = new LiteDatabase(memory);
var dbStorage = new LiteDbStorage(db);
    
var repository = new MyObjectRepository(dbStorage);
await repository.WaitForInitialize();

āĻ¯āĻĻāĻŋ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒāĻŸāĻŋ āĻšā§āĻ¯āĻžāĻ‚āĻĢāĻžāĻ¯āĻŧāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦā§‡

public void ConfigureServices(IServiceCollection services, ObjectRepository objectRepository)
{
    services.AddHangfire(s => s.UseHangfireStorage(objectRepository));
}

āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻŦāĻ¸ā§āĻ¤ā§ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§‡āĻļ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡:

var newParent = new ParentModel()
repository.Add(newParent);

āĻāĻ‡ āĻ•āĻ˛ āĻĻāĻŋāĻ¯āĻŧā§‡, āĻŦāĻ¸ā§āĻ¤ā§ āĻ…āĻ­āĻŋāĻ­āĻžāĻŦāĻ• āĻŽāĻĄā§‡āĻ˛ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻ•ā§āĻ¯āĻžāĻļā§‡ āĻāĻŦāĻ‚ āĻ¸āĻžāĻ°āĻŋ āĻ‰āĻ­āĻ¯āĻŧāĻ‡ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻāĻ‡ āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨āĻŸāĻŋ O(1) āĻ¨ā§‡āĻ¯āĻŧ, āĻāĻŦāĻ‚ āĻāĻ‡ āĻŦāĻ¸ā§āĻ¤ā§āĻŸāĻŋ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋāĻ¤ā§‡ āĻāĻ‡ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸāĻŸāĻŋ āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻŦāĻ¸ā§āĻ¤ā§āĻŸāĻŋ āĻāĻ•āĻ‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ¤āĻž āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°āĻ¤ā§‡:

var parents = repository.Set<ParentModel>();
var myParent = parents.Find(newParent.Id);
Assert.IsTrue(ReferenceEquals(myParent, newParent));

āĻ•āĻŋ āĻšāĻšā§āĻ›ā§‡? āĻ¸ā§‡āĻŸ () āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻŦāĻ°ā§āĻ¤āĻ¨ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĄāĻŋāĻ•āĻļāĻ¨āĻžāĻ°āĻŋ, āĻ¯ā§‡āĻŸāĻž āĻŦāĻšāĻ¨ āĻ•āĻ°ā§‡ āĻ¸āĻŽāĻ¸āĻžāĻŽāĻ¯āĻŧāĻŋāĻ• āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻāĻŦāĻ‚ āĻŽāĻžāĻ§ā§āĻ¯āĻŽāĻŋāĻ• āĻ¸ā§‚āĻšāĻ•ā§‡āĻ° āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻ‰āĻĒāĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ°ā§‚āĻĒā§‡ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋ āĻ¨āĻž āĻ•āĻ°ā§‡ āĻ†āĻ‡āĻĄāĻŋ (āĻŦāĻž āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻšāĻžāĻ°ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ¸ā§‚āĻšā§€) āĻĻā§āĻŦāĻžāĻ°āĻž āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ā§‡āĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻŦāĻ¸ā§āĻ¤ā§ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‹ āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋ āĻ¤āĻžāĻĻā§‡āĻ° āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻŦāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ‡ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ā§‡āĻ° āĻ•ā§‹āĻ¨ā§‹ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻĢāĻ˛ā§‡ āĻāĻ‡ āĻŦāĻ¸ā§āĻ¤ā§āĻŸāĻŋ āĻ˛ā§‡āĻ–āĻžāĻ° āĻ¸āĻžāĻ°āĻŋāĻ¤ā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ 
āĻŦāĻžāĻ‡āĻ°ā§‡ āĻĨā§‡āĻ•ā§‡ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯āĻ—ā§āĻ˛āĻŋ āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻž āĻāĻ•āĻŸāĻŋ POCO āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻŽāĻ¤ā§‹āĻ‡ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧ:

myParent.Children.First().Property = "Updated value";

āĻ†āĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ‰āĻĒāĻžāĻ¯āĻŧā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻ¸ā§āĻ¤ā§ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨:

repository.Remove(myParent);
repository.RemoveRange(otherParents);
repository.Remove<ParentModel>(x => !x.Children.Any());

āĻāĻŸāĻŋ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻ¸āĻžāĻ°āĻŋāĻ¤ā§‡ āĻŦāĻ¸ā§āĻ¤ā§āĻŸāĻŋāĻ•ā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡āĨ¤

āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡?

āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‹ āĻ°āĻŋāĻĒā§‹āĻœāĻŋāĻŸāĻ°āĻŋ āĻ¯āĻ–āĻ¨ āĻ¨āĻŋāĻ°ā§€āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻŦāĻ¸ā§āĻ¤ā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻšāĻ¯āĻŧ (āĻšāĻ¯āĻŧ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻŦāĻž āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž, āĻŦāĻž āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨), āĻāĻ•āĻŸāĻŋ āĻ˜āĻŸāĻ¨āĻž āĻ‰āĻ¤ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°ā§‡ āĻŽāĻĄā§‡āĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤āĻ¸āĻĻāĻ¸ā§āĻ¯āĻ¤āĻž āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ. āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻ¯āĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ˜āĻŸāĻ¨āĻž āĻ˜āĻŸā§‡ āĻŽāĻĄā§‡āĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ 3āĻŸāĻŋ āĻ¸āĻžāĻ°āĻŋāĻ¤ā§‡ āĻ°āĻžāĻ–āĻž āĻšāĻ¯āĻŧ - āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŦāĻ‚ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻœāĻ¨ā§āĻ¯āĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻ†āĻ°āĻŽā§āĻ­ āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡, āĻ¤āĻžāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻ¯āĻžāĻ° āĻĢāĻ˛ā§‡ āĻĒā§āĻ°āĻ¤āĻŋ 5 āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ 

āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ˛ āĻœā§‹āĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ API āĻ†āĻ›ā§‡: ObjectRepository.Save().

āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖā§‡āĻ° āĻ†āĻ—ā§‡, āĻ…āĻ°ā§āĻĨāĻšā§€āĻ¨ āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ˛āĻžāĻĒāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ¸āĻžāĻ°āĻŋ āĻĨā§‡āĻ•ā§‡ āĻ¸āĻ°āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ¸āĻĻā§ƒāĻļ āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸ - āĻ¯āĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ āĻŦāĻ¸ā§āĻ¤ā§ āĻĻā§āĻŦāĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻŦāĻž āĻĻā§āĻ°ā§āĻ¤ āĻŦāĻ¸ā§āĻ¤ā§ āĻ¯ā§āĻ•ā§āĻ¤/āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻšāĻ¯āĻŧ), āĻāĻŦāĻ‚ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¤āĻ–āĻ¨āĻ‡ āĻ¸ā§‡āĻ­ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ 

āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ¸āĻŽāĻ—ā§āĻ° āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ‡ āĻāĻŸāĻž āĻ¸āĻŽā§āĻ­āĻŦ āĻ¯ā§‡ āĻŦāĻ¸ā§āĻ¤ā§āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¸āĻžāĻ°āĻŋāĻ¤ā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻĨā§‡āĻ•ā§‡ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āĻ° āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻ—ā§āĻ˛āĻŋ āĻ¸āĻš, āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¤āĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻ­āĻŋāĻ¨ā§āĻ¨ āĻ•ā§āĻ°āĻŽā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻ•āĻŋ āĻ•āĻŋ āĻ†āĻ›ā§‡?

  • āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ .NET āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ 2.0 āĻāĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ āĻ†āĻ§ā§āĻ¨āĻŋāĻ• .NET āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤
  • API āĻĨā§āĻ°ā§‡āĻĄ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻāĨ¤ āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ¸āĻŽāĻ¸āĻžāĻŽāĻ¯āĻŧāĻŋāĻ• āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨, āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°āĻĻā§‡āĻ° āĻšāĻ¯āĻŧ āĻ¤āĻžāĻ˛āĻž āĻ†āĻ›ā§‡ āĻŦāĻž āĻ¤āĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨ā§‡āĻ‡āĨ¤ 
    āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻžāĻ° āĻŽāĻ¤ āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° āĻœāĻŋāĻ¨āĻŋāĻ¸ āĻ•āĻ˛ āĻ•āĻ°āĻž ObjectRepository.Save();
  • āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻšāĻžāĻ°ā§‡ āĻ¸ā§‚āĻšā§€ (āĻ¸ā§āĻŦāĻ¤āĻ¨ā§āĻ¤ā§āĻ°āĻ¤āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨):

repository.Set<ChildModel>().AddIndex(x => x.Value);
repository.Set<ChildModel>().Find(x => x.Value, "myValue");

āĻ•ā§‡ āĻāĻŸāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡?

āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡, āĻ†āĻŽāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻļāĻ–ā§‡āĻ° āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĻ›āĻŋ āĻ•āĻžāĻ°āĻŖ āĻāĻŸāĻŋ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻœāĻ¨āĻ• āĻāĻŦāĻ‚ āĻĄā§‡āĻŸāĻž āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ˛ā§‡āĻ¯āĻŧāĻžāĻ° āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻž āĻ­āĻžāĻ°ā§€ āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻĄāĻŧ āĻ–āĻ°āĻšā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡, litedb āĻŦāĻž āĻāĻ•āĻŸāĻŋ āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻĄā§‡āĻŸāĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻ†āĻŽāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻĨā§‡āĻˇā§āĻŸāĨ¤ 

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ…āĻ¤ā§€āĻ¤ā§‡, āĻ¯āĻ–āĻ¨ āĻāĻ–āĻ¨ āĻŦāĻŋāĻ˛ā§āĻĒā§āĻ¤ āĻ¸ā§āĻŸāĻžāĻ°ā§āĻŸāĻ†āĻĒ EscapeTeams (āĻ†āĻŽāĻŋ āĻ­āĻžāĻŦāĻ˛āĻžāĻŽ āĻāĻŸāĻž āĻāĻ–āĻžāĻ¨ā§‡, āĻŸāĻžāĻ•āĻž - āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¨āĻž, āĻ†āĻŦāĻžāĻ° āĻ…āĻ­āĻŋāĻœā§āĻžāĻ¤āĻž) - Azure āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœā§‡ āĻĄā§‡āĻŸāĻž āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧāĨ¤

āĻ­āĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻž

āĻ†āĻŽāĻŋ āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ…āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ - āĻ…āĻ¨ā§āĻ­ā§‚āĻŽāĻŋāĻ• āĻ¸ā§āĻ•ā§‡āĻ˛āĻŋāĻ‚āĨ¤ āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻšāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ•āĻ°āĻž āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ (sic!), āĻ…āĻĨāĻŦāĻž āĻāĻ•āĻŸāĻŋ āĻĻā§ƒāĻĸāĻŧ-āĻ‡āĻšā§āĻ›āĻžāĻ•ā§ƒāĻ¤ āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯ā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻĻā§ƒāĻˇā§āĻŸāĻžāĻ¨ā§āĻ¤ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻ‡ āĻĄā§‡āĻŸāĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¨āĻ¯āĻŧ, āĻ…āĻĨāĻŦāĻž "āĻļā§‡āĻˇ āĻ•ā§‡ āĻ¸āĻ āĻŋāĻ•" āĻ¨ā§€āĻ¤āĻŋ āĻ…āĻ¨ā§āĻ¸āĻžāĻ°ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĻāĻŋāĻ¨āĨ¤

āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤ āĻĻā§ƒāĻˇā§āĻŸāĻŋāĻ•ā§‹āĻŖ āĻĨā§‡āĻ•ā§‡, āĻ†āĻŽāĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ¸ā§āĻ•āĻŋāĻŽāĻŸāĻŋ āĻ¯āĻ¤āĻŸāĻž āĻ¸āĻŽā§āĻ­āĻŦ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻšā§āĻ›āĻŋ:

  • āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻŽāĻĄā§‡āĻ˛ā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸāĻ˛āĻ— āĻāĻŦāĻ‚ āĻ¸ā§āĻ¨ā§āĻ¯āĻžāĻĒāĻļāĻŸ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§āĻ¨
  • āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĻā§ƒāĻˇā§āĻŸāĻžāĻ¨ā§āĻ¤ āĻ–ā§āĻāĻœā§āĻ¨ (āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĻā§ƒāĻˇā§āĻŸāĻžāĻ¨ā§āĻ¤ā§‡āĻ° āĻļā§‡āĻˇ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨? udp āĻ†āĻŦāĻŋāĻˇā§āĻ•āĻžāĻ°? āĻŽāĻžāĻ¸ā§āĻŸāĻžāĻ°/āĻĻāĻžāĻ¸?)
  • RAFT āĻāĻ° āĻŽāĻ¤ā§‹ āĻ¯ā§‡āĻ•ā§‹āĻ¨ āĻ•āĻ¨āĻ¸ā§‡āĻ¨āĻ¸āĻžāĻ¸ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ EventLog āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ˛āĻŋāĻĒāĻŋ āĻ•āĻ°ā§āĻ¨ā§ˇ

āĻ†āĻ°āĻ“ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻž āĻ†āĻŽāĻžāĻ•ā§‡ āĻ‰āĻĻā§āĻŦāĻŋāĻ—ā§āĻ¨ āĻ•āĻ°ā§‡ - āĻ•ā§āĻ¯āĻžāĻ¸āĻ•ā§‡āĻĄ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž, āĻŦāĻž āĻ…āĻ¨ā§āĻ¯ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻĨā§‡āĻ•ā§‡ āĻ˛āĻŋāĻ™ā§āĻ• āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŽāĻ¨ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¸āĻ¨āĻžāĻ•ā§āĻ¤āĻ•āĻ°āĻŖāĨ¤ 

āĻ‰āĻ¤ā§āĻ¸ āĻ•ā§‹āĻĄ

āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻ–āĻžāĻ¨ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒāĻĨ āĻĒāĻĄāĻŧā§‡ āĻĨāĻžāĻ•ā§‡āĻ¨, āĻ¤āĻŦā§‡ āĻ¯āĻž āĻŦāĻžāĻ•āĻŋ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻž āĻšāĻ˛ āĻ•ā§‹āĻĄāĻŸāĻŋ āĻĒāĻĄāĻŧāĻ¤ā§‡; āĻāĻŸāĻŋ āĻ—āĻŋāĻŸāĻšāĻžāĻŦā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§‡:
https://github.com/DiverOfDark/ObjectRepository

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨