ObjectRepository - рддрдкрд╛рдИрдВрдХреЛ рдЧреГрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ NET рдЗрди-рдореЗрдореЛрд░реА рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдврд╛рдБрдЪрд╛

рдХрд┐рди рдореЗрдореЛрд░реАрдорд╛ рд╕рдмреИ рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдиреЗ?

рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╡рд╛ рдмреНрдпрд╛рдХрдЗрдиреНрдб рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди, рдзреЗрд░реИ рд╕рдордЭрджрд╛рд░ рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрдХреЛ рдкрд╣рд┐рд▓реЛ рдЗрдЪреНрдЫрд╛ SQL рдбрд╛рдЯрд╛рдмреЗрд╕ рдЫрдиреМрдЯ рдЧрд░реНрди рд╣реБрдиреЗрдЫред 

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

рд╕рдмреИрднрдиреНрджрд╛ рдЦрд░рд╛рдм рдЕрд╡рд╕реНрдерд╛ рд╣реЛ рдЬрдм рддрдкрд╛рдЗрдБ рдПрдХ рдЯреЛрд▓реАрдорд╛ рдХрд╛рдо рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рд░ рдПрдХ рд╕рд╣рдХрд░реНрдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫреИрди рдХрд┐ рдХрд╕рд░реА рджреНрд░реБрдд рдкреНрд░рд╢реНрдирд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗред рддрдкрд╛рдИрдВрд▓реЗ N+1 рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд░ рдердк рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдХрддрд┐ рд╕рдордп рдЦрд░реНрдЪ рдЧрд░реНрдиреБрднрдпреЛ рддрд╛рдХрд┐ рдореБрдЦреНрдп рдкреГрд╖реНрдардорд╛ рд░рд╣реЗрдХреЛ SELECT рдЙрдЪрд┐рдд рд╕рдордпрдорд╛ рдкреВрд░рд╛ рд╣реЛрд╕реН?

рдЕрд░реНрдХреЛ рд▓реЛрдХрдкреНрд░рд┐рдп рджреГрд╖реНрдЯрд┐рдХреЛрдг NoSQL рд╣реЛред рдзреЗрд░реИ рд╡рд░реНрд╖ рдкрд╣рд┐рд▓реЗ рдпрд╕ рд╡рд┐рд╖рдпрдХреЛ рд╡рд░рд┐рдкрд░рд┐ рдзреЗрд░реИ рдкреНрд░рдЪрд╛рд░ рдерд┐рдпреЛ - рдХреБрдиреИ рдкрдирд┐ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЕрд╡рд╕рд░рдХреЛ рд▓рд╛рдЧрд┐ рддрд┐рдиреАрд╣рд░реВрд▓реЗ MongoDB рддреИрдирд╛рдд рдЧрд░реЗ рд░ json рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдЬрд╡рд╛рдлрд╣рд░реВрд╕рдБрдЧ рдЦреБрд╕реА рдерд┐рдПред (рд╡реИрд╕реЗ, рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВрдорд╛ рдЧреЛрд▓рд╛рдХрд╛рд░ рд▓рд┐рдЩреНрдХрд╣рд░реВрдХреЛ рдХрд╛рд░рдгрд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ рдХрддрд┐рд╡рдЯрд╛ рдмреИрд╕рд╛рдЦреАрд╣рд░реВ рд╕рдореНрдорд┐рд▓рд┐рдд рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛ?).

рдо рдЕрд░реНрдХреЛ, рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдиреНрдЫреБ - рдХрд┐рди рд╕рдмреИ рдбрд╛рдЯрд╛рд▓рд╛рдИ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдореЗрдореЛрд░реАрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдирдЧрд░реНрдиреЗ, рдЖрд╡рдзрд┐рдХ рд░реВрдкрдорд╛ рдпрд╕рд▓рд╛рдИ рдЕрдирд┐рдпрдорд┐рдд рднрдгреНрдбрд╛рд░рдг (рдлрд╛рдЗрд▓, рд░рд┐рдореЛрдЯ рдбрд╛рдЯрд╛рдмреЗрд╕) рдорд╛ рдмрдЪрдд рдЧрд░реНрдиреЗ? 

рдореЗрдореЛрд░реА рд╕рд╕реНрддреЛ рднрдПрдХреЛ рдЫ, рд░ рдзреЗрд░реИрдЬрд╕реЛ рд╕рд╛рдирд╛ рд░ рдордзреНрдпрдо рдЖрдХрд╛рд░рдХрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХреБрдиреИ рдкрдирд┐ рд╕рдореНрднрд╛рд╡рд┐рдд рдбреЗрдЯрд╛ 1 GB рдореЗрдореЛрд░реАрдорд╛ рдлрд┐рдЯ рд╣реБрдиреЗрдЫред (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдореЗрд░реЛ рдордирдкрд░реНрдиреЗ рдЧреГрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛ рд╡рд┐рддреНрддреАрдп рдЯреНрд░рдпрд╛рдХрд░, рдЬрд╕рд▓реЗ рджреИрдирд┐рдХ рддрдереНрдпрд╛рдЩреНрдХ рд░ рдореЗрд░реЛ рдЦрд░реНрдЪ, рдмреНрдпрд╛рд▓реЗрдиреНрд╕, рд░ рд▓реЗрдирджреЗрдирдХреЛ рдбреЗрдв рд╡рд░реНрд╖рдХреЛ рдЗрддрд┐рд╣рд╛рд╕ рд░рд╛рдЦреНрдЫ, рдХреЗрд╡рд▓ 45 MB рдореЗрдореЛрд░реА рдЦрдкрдд рдЧрд░реНрджрдЫред)

рдкреНрд░реЛ:

  • рдбрд╛рдЯрд╛рдорд╛ рдкрд╣реБрдБрдЪ рд╕рдЬрд┐рд▓реЛ рд╣реБрдиреНрдЫ - рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рд╢реНрдирд╣рд░реВ, рдЕрд▓реНрдЫреА рд▓реЛрдбрд┐рдЩ, ORM рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЪрд┐рдиреНрддрд╛ рд▓рд┐рдиреБ рдкрд░реНрджреИрди, рддрдкрд╛рдИрдВрд▓реЗ рд╕рд╛рдзрд╛рд░рдг C# рд╡рд╕реНрддреБрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ;
  • рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбрд╣рд░реВрдмрд╛рдЯ рдкрд╣реБрдБрдЪрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдХреБрдиреИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЫреИрдирдиреН;
  • рдзреЗрд░реИ рдЫрд┐рдЯреЛ - рдХреБрдиреИ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдЫреИрди, рдХреБрдиреИ рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛рдорд╛ рдХреЛрдбрдХреЛ рдЕрдиреБрд╡рд╛рдж рдЫреИрди, рд╡рд╕реНрддреБрд╣рд░реВрдХреЛ (de) рдХреНрд░рдордмрджреНрдзрддрд╛рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЫреИрди;
  • рдпреЛ рдХреБрдиреИ рдкрдирд┐ рд░реВрдкрдорд╛ рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рд╕реНрд╡реАрдХрд╛рд░реНрдп рдЫ - рдпреЛ рдбрд┐рд╕реНрдХрдорд╛ XML рдорд╛, рд╡рд╛ SQL рд╕рд░реНрднрд░рдорд╛, рд╡рд╛ Azure рддрд╛рд▓рд┐рдХрд╛ рднрдгреНрдбрд╛рд░рдгрдорд╛ред

Cons:

  • рддреЗрд░реНрд╕реЛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╣рд░рд╛рдПрдХреЛ рдЫ, рд░ рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд╢реВрдиреНрдп рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдбрд┐рдкреНрд▓реЛрдЗрдореЗрдиреНрдЯ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди;
  • рдпрджрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреНрд░реНрдпрд╛рд╕ рднрдпреЛ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдкрдорд╛ рдбрд╛рдЯрд╛ рдЧреБрдорд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред (рддрд░ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╣рд┐рд▓реНрдпреИ рдХреНрд░реНрдпрд╛рд╕ рд╣реБрдБрджреИрди, рд╣реИрди?)

рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЫ:

  • рд╕реБрд░реБрдорд╛, рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдгрд╕рдБрдЧ рдЬрдбрд╛рди рд╕реНрдерд╛рдкрд┐рдд рд╣реБрдиреНрдЫ, рд░ рдбрд╛рдЯрд╛ рд▓реЛрдб рд╣реБрдиреНрдЫ;
  • рдПрдХ рд╡рд╕реНрддреБ рдореЛрдбреЗрд▓, рдкреНрд░рд╛рдердорд┐рдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ, рд░ рд░рд┐рд▓реЗрд╢рдирд▓ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╣рд░реВ (рез:рез, рез:рдзреЗрд░реИ) рдмрдирд╛рдЗрдПрдХрд╛ рдЫрдиреН;
  • рд╡рд╕реНрддреБ рдЧреБрдгрд╣рд░реВрдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ (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();

рдпрджрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛рд▓реЗ HangFire рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫ

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 рд╕реЗрдХреЗрдиреНрдбрдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдмрдЪрдд рд╣реБрдиреЗ рдЧрд░реНрджрдЫред 

рдердк рд░реВрдкрдорд╛, рддреНрдпрд╣рд╛рдБ рдмрдЪрдд рдХрд▓ рдмрд▓ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдкреАрдЖрдИ рдЫ: 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 Table Storage рдорд╛ рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред

рднрд╡рд┐рд╖реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдпреЛрдЬрдирд╛рд╣рд░реВ

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

рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдгрдмрд╛рдЯ, рдо рдирд┐рдореНрди рдпреЛрдЬрдирд╛рд▓рд╛рдИ рд╕рдореНрднрд╡ рджреЗрдЦреНрдЫреБ:

  • рд╡рд╕реНрддреБ рдореЛрдбреЗрд▓рдХреЛ рд╕рдЯреНрдЯрд╛ EventLog рд░ рд╕реНрдиреНрдпрд╛рдкрд╕рдЯ рднрдгреНрдбрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдиреБрд╣реЛрд╕реН (рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рд╕рдмреИ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрдХреЛ рдЕрдиреНрддрд┐рдо рдмрд┐рдиреНрджреБрд╣рд░реВ рдердкреНрдиреБрд╣реЛрд╕реН? udp рдЦреЛрдЬ? рдорд╛рд╕реНрдЯрд░/рджрд╛рд╕?)
  • RAFT рдЬрд╕реНрддрд╛ рдХреБрдиреИ рдкрдирд┐ рд╕рд╣рдорддрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдорд╛рд░реНрдлрдд EventLog рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдмреАрдЪ рдирдХреНрдХрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рддреНрдпрд╣рд╛рдБ рдЕрд░реНрдХреЛ рд╕рдорд╕реНрдпрд╛ рдкрдирд┐ рдЫ рдЬрд╕рд▓реЗ рдорд▓рд╛рдИ рдЪрд┐рдиреНрддрд┐рдд рдмрдирд╛рдЙрдБрдЫ - рдХреНрдпрд╛рд╕реНрдХреЗрдб рдореЗрдЯрд╛рдЙрдиреЗ, рд╡рд╛ рдЕрдиреНрдп рд╡рд╕реНрддреБрд╣рд░реВрдмрд╛рдЯ рд▓рд┐рдЩреНрдХ рднрдПрдХрд╛ рд╡рд╕реНрддреБрд╣рд░реВ рдореЗрдЯрд╛рдЙрдиреЗ рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреЗред 

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

рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдпрд╣рд╛рдБ рд╕рдореНрдо рд╕рдмреИ рддрд░рд┐рдХрд╛ рдкрдвреНрдиреБрднрдпреЛ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рдмрд╛рдБрдХреА рд╕рдмреИ рдХреЛрдб рдкрдвреНрдиреБ рд╣реЛ; рдпреЛ GitHub рдорд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ:
https://github.com/DiverOfDark/ObjectRepository

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди