рдСрдмреНрдЬреЗрдХреНрдЯрд░рд┐рдкреЙрдЬрд┐рдЯрд░реА - .рдиреЗрдЯ рдЗрди-рдореЗрдорд░реА рд░рд┐рдкреЙрдЭрд┐рдЯрд░реА рдкреЕрдЯрд░реНрди рддреБрдордЪреНрдпрд╛ рдЧреГрд╣рдкреНрд░рдХрд▓реНрдкрд╛рдВрд╕рд╛рдареА

рд╕рд░реНрд╡ рдбреЗрдЯрд╛ рдореЗрдорд░реАрдордзреНрдпреЗ рдХрд╛ рд╕рд╛рдард╡рд╛рдпрдЪрд╛?

рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд┐рдВрд╡рд╛ рдмреЕрдХрдПрдВрдб рдбреЗрдЯрд╛ рд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдмрд╣реБрддреЗрдХ рд╕рдордЬрджрд╛рд░ рд▓реЛрдХрд╛рдВрдЪреА рдкрд╣рд┐рд▓реА рдЗрдЪреНрдЫрд╛ SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдирд┐рд╡рдбрдгреНрдпрд╛рдЪреА рдЕрд╕реЗрд▓. 

рдкрд░рдВрддреБ рдХрдзреАрдХрдзреА рдЕрд╕рд╛ рд╡рд┐рдЪрд╛рд░ рдпреЗрддреЛ рдХреА рдбреЗрдЯрд╛ рдореЙрдбреЗрд▓ SQL рд╕рд╛рдареА рдпреЛрдЧреНрдп рдирд╛рд╣реА: рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╢реЛрдз рдХрд┐рдВрд╡рд╛ рд╕рд╛рдорд╛рдЬрд┐рдХ рдЖрд▓реЗрдЦ рддрдпрд╛рд░ рдХрд░рддрд╛рдирд╛, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рдордзреАрд▓ рдЬрдЯрд┐рд▓ рд╕рдВрдмрдВрдз рд╢реЛрдзрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. 

рд╕рд░реНрд╡рд╛рдд рд╡рд╛рдИрдЯ рдкрд░рд┐рд╕реНрдерд┐рддреА рдЕрд╕рддреЗ рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рдПрдЦрд╛рджреНрдпрд╛ рд╕рдВрдШрд╛рдд рдХрд╛рдо рдХрд░рддрд╛ рдЖрдгрд┐ рдПрдЦрд╛рджреНрдпрд╛ рд╕рд╣рдХрд╛рд▒реНрдпрд╛рд▓рд╛ рддреНрд╡рд░рд┐рдд рдкреНрд░рд╢реНрди рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ рд╣реЗ рдорд╛рд╣рд┐рдд рдирд╕рддреЗ. рддреБрдореНрд╣реА N+1 рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд┐рддреА рд╡реЗрд│ рдШрд╛рд▓рд╡рд▓рд╛ рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реВрди рдореБрдЦреНрдп рдкреГрд╖реНрдард╛рд╡рд░реАрд▓ SELECT рд╡рд╛рдЬрд╡реА рд╡реЗрд│реЗрдд рдкреВрд░реНрдг рд╣реЛрдИрд▓?

рдЖрдгрдЦреА рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рджреГрд╖реНрдЯреАрдХреЛрди рдореНрд╣рдгрдЬреЗ NoSQL. рдЕрдиреЗрдХ рд╡рд░реНрд╖рд╛рдВрдкреВрд░реНрд╡реА рдпрд╛ рд╡рд┐рд╖рдпрд╛рднреЛрд╡рддреА рдЦреВрдк рдкреНрд░рдЪрд╛рд░ рд╣реЛрддрд╛ - рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реЛрдпреАрд╕реНрдХрд░ рдкреНрд░рд╕рдВрдЧреА рддреНрдпрд╛рдВрдиреА рдореЛрдВрдЧреЛрдбреАрдмреА рддреИрдирд╛рдд рдХреЗрд▓реЗ рдЖрдгрд┐ 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();
    }
}

рдСрдмреНрдЬреЗрдХреНрдЯрд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЙрджрд╛рд╣рд░рдг рддрдпрд╛рд░ рдХрд░рд╛:

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());

рд╣реЗ рд╣рдЯрд╡рдгреНрдпрд╛рдЪреНрдпрд╛ рд░рд╛рдВрдЧреЗрдд рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрдЦреАрд▓ рдЬреЛрдбрддреЗ.

рдмрдЪрдд рдХрд╢реА рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рдСрдмреНрдЬреЗрдХреНрдЯрд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЬреЗрд╡реНрд╣рд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд╕реНрддреВ рдмрджрд▓рддрд╛рдд (рдПрдХрддрд░ рдЬреЛрдбрдгреЗ рдХрд┐рдВрд╡рд╛ рд╣рдЯрд╡рдгреЗ, рдХрд┐рдВрд╡рд╛ рдЧреБрдгрдзрд░реНрдо рдмрджрд▓рдгреЗ), рдШрдЯрдирд╛ рд╡рд╛рдврд╡рддреЗ рдореЙрдбреЗрд▓ рдмрджрд▓рд▓реЗрдЪреЗ рд╕рджрд╕реНрдпрддреНрд╡ рдШреЗрддрд▓реЗ ISрд╕реНрдЯреЛрд░реЗрдЬ. рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА ISрд╕реНрдЯреЛрд░реЗрдЬ рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджреА рдШрдЯрдирд╛ рдШрдбрддреЗ рдореЙрдбреЗрд▓ рдмрджрд▓рд▓реЗ рдмрджрд▓ 3 рд░рд╛рдВрдЧрд╛рдВрдордзреНрдпреЗ рдареЗрд╡рд▓реЗ рдЖрд╣реЗрдд - рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА, рдЕрдкрдбреЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╣рдЯрд╡рдгреНрдпрд╛рд╕рд╛рдареА.

рддрд╕реЗрдЪ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА ISрд╕реНрдЯреЛрд░реЗрдЬ рдкреНрд░рд╛рд░рдВрдн рдХреЗрд▓реНрдпрд╛рд╡рд░, рддреЗ рдПрдХ рдЯрд╛рдЗрдорд░ рддрдпрд╛рд░ рдХрд░рддрд╛рдд рдЬреНрдпрд╛рдореБрд│реЗ рдмрджрд▓ рджрд░ 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 рдХрд┐рдВрд╡рд╛ рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреЗ рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рд╕рд╣рд╕рд╛ рдкреБрд░реЗрд╕реЗ рдЕрд╕рддреЗ. 

рдкрдг рднреВрддрдХрд╛рд│рд╛рдд, рдЬреЗрд╡реНрд╣рд╛ рдЖрддрд╛ рдмрдВрдж рдкрдбрд▓реЗрд▓реНрдпрд╛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк EscapeTeems (рдорд▓рд╛ рд╡рд╛рдЯрд▓реЗ рдЗрдереЗрдЪ рдЖрд╣реЗ, рдкреИрд╕рд╛ - рдкрдг рдирд╛рд╣реА, рдкреБрдиреНрд╣рд╛ рдЕрдиреБрднрд╡) - Azure рдЯреЗрдмрд▓ рд╕реНрдЯреЛрд░реЗрдЬрдордзреНрдпреЗ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ.

рднрд╡рд┐рд╖реНрдпрд╛рд╕рд╛рдареА рдпреЛрдЬрдирд╛

рдореА рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рдЪреНрдпрд╛ рдореБрдЦреНрдп рддреЛрдЯреНрдпрд╛рдВрдкреИрдХреА рдПрдХ рдирд┐рд░рд╛рдХрд░рдг рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ - рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдХреЗрд▓рд┐рдВрдЧ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдХрддрд░ рд╡рд┐рддрд░рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ (sic!), рдХрд┐рдВрд╡рд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреАрд▓ рд╕рдорд╛рди рдбреЗрдЯрд╛ рдмрджрд▓реВ рдирдпреЗ рдЕрд╕рд╛ рджреГрдв-рдЗрдЪреНрдЫреЗрдиреЗ рдирд┐рд░реНрдгрдп рдШреНрдпрд╛ рдХрд┐рдВрд╡рд╛ "рдЬреЛ рд╢реЗрд╡рдЯрдЪрд╛ рдЖрд╣реЗ рддреЛ рдмрд░реЛрдмрд░ рдЖрд╣реЗ" рдпрд╛ рддрддреНрддреНрд╡рд╛рдиреБрд╕рд╛рд░ рдмрджрд▓реВ рджреНрдпрд╛.

рддрд╛рдВрддреНрд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди, рдорд▓рд╛ рдЦрд╛рд▓реАрд▓ рдпреЛрдЬрдирд╛ рд╢рдХреНрдп рддрд┐рддрдХреНрдпрд╛ рджрд┐рд╕рддрд╛рдд:

  • рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбреЗрд▓рдРрд╡рдЬреА рдЗрд╡реНрд╣реЗрдВрдЯрд▓реЙрдЧ рдЖрдгрд┐ рд╕реНрдиреЕрдкрд╢реЙрдЯ рд╕реНрдЯреЛрдЕрд░ рдХрд░рд╛
  • рдЗрддрд░ рдЙрджрд╛рд╣рд░рдгреЗ рд╢реЛрдзрд╛ (рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдордзреНрдпреЗ рд╕рд░реНрд╡ рдШрдЯрдирд╛рдВрдЪреЗ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреВ рдЬреЛрдбрд╛? udp рд╢реЛрдз? рдорд╛рд╕реНрдЯрд░/рд╕реНрд▓реЗрд╡реНрд╣?)
  • RAFT рд╕рд╛рд░рдЦреНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдПрдХрдордд рдЕрд▓реНрдЧреЛрд░рд┐рджрдорджреНрд╡рд╛рд░реЗ EventLog рдЙрджрд╛рд╣рд░рдгрд╛рдВрдордзреНрдпреЗ рдкреНрд░рддрд┐рдХреГрддреА рддрдпрд╛рд░ рдХрд░рд╛.

рдЖрдгрдЦреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ рдЬреА рдорд▓рд╛ рдЪрд┐рдВрддрд┐рдд рдХрд░рддреЗ - рдХреЕрд╕реНрдХреЗрдб рд╣рдЯрд╡рдгреЗ, рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕рдЪреНрдпрд╛ рд▓рд┐рдВрдХреНрд╕ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╣рдЯрд╡рд┐рдгреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдВрдЪрд╛ рд╢реЛрдз. 

рд╕реНрддреНрд░реЛрдд рдХреЛрдб

рдЬрд░ рддреБрдореНрд╣реА рдЗрдердкрд░реНрдпрдВрдд рд╕рд░реНрд╡ рдорд╛рд░реНрдЧ рд╡рд╛рдЪрд▓рд╛ рдЕрд╕реЗрд▓, рддрд░ рдХреЛрдб рд╡рд╛рдЪрдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ; рддреЗ GitHub рд╡рд░ рдЖрдврд│реВ рд╢рдХрддреЗ:
https://github.com/DiverOfDark/ObjectRepository

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛