áá±áá¬á¡á¬ážáá¯á¶ážááᯠmemory áá²ááŸá¬ áá¬ááŒá±á¬áá·áº ááááºážáá¬ážáá¬áá²á
ááá¯áẠááá¯á·ááá¯áẠáá±á¬ááºááœááºááœáẠáá±áá¬ááᯠááááºážáááºážáááºá áá°á¡áá»á¬ážá á¯á ááááá¯á¶ážááá¹áááŸá¬ SQL áá±áá¬áá±á·á áºááᯠááœá±ážáá»ááºáááºááŒá áºáááºá
ááá¯á·áá±á¬áº áá áºáá«áá áºáá¶ááœáẠáá±áá¬áá±á¬áºáááºááẠSQL á¡ááœáẠáááá·áºáá»á±á¬áºááŒá±á¬ááºáž á¡ááœá±ážáááºáá¬áááº- á¥ááá¬á ááŸá¬ááœá±ááŸá¯ ááá¯á·ááá¯áẠáá°ááŸá¯áá±ážááááºááºáá áºáᯠáááºáá±á¬ááºááá·áºá¡áá«á á¡áá¬ááá¹áá¯áá»á¬ážá¡ááŒá¬áž ááŸá¯ááºááœá±ážáá±á¬ áááºáá¶áá±ážáá»á¬ážááᯠááŸá¬ááœá±ááẠááá¯á¡ááºáááºá
á¡ááá¯ážáá¯á¶ážá¡ááŒá±á¡áá±ááŸá¬ áááºá¡áááºážá¡ááœá²á·ááœááºá¡áá¯ááºáá¯ááºááŒá®áž áá¯ááºáá±á¬áºááá¯ááºáááºáá áºáŠážááẠá¡ááŒááºáá±ážááœááºážáá»á¬ážááᯠáááºááá¯á·áááºáá±á¬ááºááááºááᯠáááááŒááºážáááºááŒá áºáááºá N+1 ááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážááŒá®áž áááºáá á¬áá»ááºááŸá¬ááŸá SELECT ááẠáá»áá¯ážááŒá±á¬ááºážáá®áá»á±á¬áºáá±á¬ á¡áá»áááºá¡ááá¯ááºážá¡áá¬áá áºáá¯á¡ááœááºáž ááŒá®ážááŒá±á¬ááºá á±áááºá¡ááœáẠáá±á¬ááºáááºá¡ááœáŸááºážááááºážáá»á¬áž áááºáá±á¬ááºááŒááºážááá¯á·ááᯠáááºá¡áá»áááºáááºáá»áŸáá¯á¶ážá áœá²áá²á·ááááºážá
áá±á¬ááºáááºáá°ááŒáá¯ááºáá»á¬ážáá±á¬áá»ááºážáááºáááºážááŸá¬ NoSQL ááŒá áºáááºá ááœááºáá²á·áá±á¬ááŸá áºáá±á«ááºážáá»á¬ážá áœá¬á á€á¡ááŒá±á¬ááºážá¡áá¬ááŸáá·áºáááºáááºá áá±á¬ááºážááœááŸá¯áá»á¬ážá áœá¬ááŸááá²á·ááẠ- áááºážááá¯á·ááẠMongoDB ááá¯á¡áá¯á¶ážááŒá¯á á¡áááºááŒá±ááá·áºá¡áá»áááºá¡áá«áá»áá¯ážááœáẠjson á á¬ááœááºá á¬áááºážáá¯á¶á á¶ááŒáá·áº á¡ááŒá±áá»á¬ážááᯠáá»á±á¬áºááœáŸááºá áœá¬á¡áá¯á¶ážááŒá¯áá²á·ááŒááẠ(á á¬ááœááºá á¬áááºážáá»á¬ážááœáẠá ááºááá¯ááºážáá¯á¶ááá·áºááºáá»á¬ážááŒá±á¬áá·áº áá»áá¯ááºážáá±á¬ááºáááºáá»áŸááá·áºáá²á·áááááºážá).
á¡ááŒá¬ážá¡ááŒá¬ážááœá±ážáá»ááºá áá¬áááºážáááºážááᯠá ááºážáá¯á¶ážááŒáá·áºááá¯á· á¡ááŒá¶ááŒá¯ááá¯áá«áááº- áá±áá¬á¡á¬ážáá¯á¶ážááᯠá¡ááá®áá±ážááŸááºážááŸááºáá¬ááºáá²ááŸá¬ ááááºážáááºážáá¬ážááá¯á· áááŒáá¯ážá á¬ážáá«áá²á·á áááºážááᯠáá»áááºážááááºážáááºážááŒááºáž (ááá¯ááºá á¡áá±ážááááºážáá±áá¬áá±á·á áº) ááŸá¬ á¡áá«á¡á¬ážáá»á±á¬áºá áœá¬ ááááºážáááºážáá«á
Memory ááẠá
á»á±ážáá±á«áá¬ááŒá®áž á¡áá±ážá
á¬ážááŸáá·áº á¡áááºá
á¬ážááá±á¬áá»ááºáá»á¬ážá¡ááœáẠááŒá
áºááá¯ááºááá·áºáá±áá¬ááŸááºááá»áŸááᯠ1 GB áááºááá¯áá®ááœáẠááá·áºáá±ážáá«áááºá (á¥ááá¬á áá»áœááºáá±á¬áºá¡ááŒáá¯ááºáá¯á¶áž á¡áááºááá±á¬áá»ááºá
á¡ááŒá áºááœá±:
- áá±áá¬á¡áá¯á¶ážááŒá¯ááœáá·áºááẠááá¯ááá¯ááœááºáá°áá¬ááẠ- áááºáá±ážááŒááºážáá»ááºáá»á¬ážá áá»ááºážááá áœá¬áááºááŒááºážá ORM á¡ááºá¹áá«áááºáá»á¬ážááŸáá·áº áááºáááºá á áááºáá°á áá¬áááá¯áá«á áááºááẠáá¬ááẠC# á¡áá¬ááá¹áá¯áá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºáá«áááºá
- ááá°áá®áá±á¬ á á¬ááœá²áá»á¬ážá០áááºáá±á¬ááºááŒáá·áºááŸá¯ááŒááºážááŸáá·áº áááºá ááºáá±á¬ ááŒá¿áá¬áááŸááá«á
- á¡ááœááºáá»ááºááŒááºááẠ- ááœááºáááºáá±á¬ááºážááá¯ááŸá¯áá»á¬ážáááŸáá áá¯ááºááᯠquery áá¬áá¬á áá¬ážááá¯á· áá¬áá¬ááŒááºááŒááºážáááŸáá á¡áá¬ááá¹áá¯áá»á¬ážá á¡ááŸááºá áẠ(de)serialization ááŒá¯áá¯ááºááẠáááá¯á¡ááºáá«á
- áá±áá¬ááᯠáááºááá·áºáá¯á¶á á¶ááŒáá·áº ááááºážáááºážááá¯ááºááẠ- áá áºááºáá±á«áºááœáẠXML ááœááºááŒá áºá á±á SQL Server ááœááºááŒá áºá á± ááá¯á·ááá¯áẠAzure Table Storage ááœááºááŒá áºá á± áááºáá¶ááá¯ááºáááºá
cons:
- á¡áá»á¬ážááá¯áẠá¡ááá¯ááºážá¡áá¬ááᯠáá¯á¶ážááŸá¯á¶ážááœá¬ážááŒá®áž ááááºá¡áá±ááŒáá·áº áá¯áá ááºáááºáá»ááẠááŒáá·áºáá»ááºááŸá¯ááᯠáá¯ááºáá±á¬ááºááááá«á
- á¡ááá®áá±ážááŸááºážáá»ááºááœá¬ážáá«á áááºááẠáá±áá¬áá áºá áááºáá áºááá¯ááºáž áá¯á¶ážááŸá¯á¶ážááá¯ááºáááºá (áá«áá±ááá·áº áá»áœááºáá±á¬áºááá¯á·áá²á· application á áááºáá±á¬á·á០áá»ááºáááœá¬ážáá«áá°ážá áá¯ááºáááºááá¬áž?)
áááºááá¯á¡áá¯ááºáá¯ááºááá²
algorithm ááŸá¬á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááºá
- á¡á ááœááºá áá±áá¬ááááºážáááºážááŸá¯ááŸáá·áºá¡áá° áá»áááºáááºááŸá¯áá áºáá¯ááᯠáááºáá±á¬ááºáá¬ážááŒá®áž áá±áá¬ááᯠáááºáá±á¬ááºáá¬ážáááºá
- á¡áá¬ááá¹áá¯áá¯á¶á á¶á áááºáá¡ááœáŸááºážááááºážáá»á¬ážááŸáá·áº áááºá ááºááœáŸááºážááááºážáá»á¬áž (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;
}
áá±á¬ááºáá¯á¶ážá¡áá±ááŸáá·áºá áá±áá¬ááá¯ááá°áááºá¡ááœáẠrepository class ááá¯ááºááá¯ááº
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);
á€áá±á«áºááá¯ááŸá¯ááŸáá·áºá¡áá°, á¡áá¬ááá¹áᯠParentModel áá±áá¬áá±á·á áºááá¯á·á á¬áá±ážáááºá¡ááœáẠlocal cache ááŸáá·áº áááºážá á®ááŸá áºáá¯áá¯á¶ážááᯠáá±á«ááºážááá·áºáá¬ážáááºá ááá¯á·ááŒá±á¬áá·áºá á€áá¯ááºáá±á¬ááºáá»ááºááẠO(1) ááá¯áá°á á€á¡áá¬ááá¹áá¯ááŸáá·áº áá»ááºáá»ááºážáá¯ááºáá±á¬ááºááá¯ááºáááºá
á¥ááá¬á¡á¬ážááŒáá·áºá ááá¯ááŸá±á¬ááºááŸá¯ááœáẠá€á¡áá¬ááá¹áá¯ááᯠááŸá¬áááºááŸáá·áº ááŒááºáá±ážááá·áºá¡áá¬ááẠáá°áá®áá±á¬á¥ááá¬ááŒá áºááŒá±á¬ááºáž á á áºáá±ážáááº-
var parents = repository.Set<ParentModel>();
var myParent = parents.Find(newParent.Id);
Assert.IsTrue(ReferenceEquals(myParent, newParent));
áá¬ááŒá áºáá±áá¬áá²? áááºááŸááºáááºá ( ) ááŒááºáá¬ááẠááá¬ážá¡áááá¬ááºáá«ááŸááááºá ááŒáá¯ááºáá°á¡áááá¬áẠáá°áááŸáá·áº á¡áááºáááºáž á¡ááœáŸááºážááááºážáá»á¬ážá á¡ááá¯áá¯ááºáá±á¬ááºáá»ááºááᯠáá¶á·ááá¯ážáá±ážáááºá áááºážááẠá¡áá¬ááá¹áá¯á¡á¬ážáá¯á¶ážááᯠáá¯á¶ážááááºááœááºážáá¶ááŒááºážáááŒá¯áá² Id (ááá¯á·ááá¯áẠá¡ááŒá¬ážáááºáááá¯á¡áá¯á¶ážááŒá¯áá°á¡ááœáŸááºážáá»á¬áž) ááŒáá·áº ááŸá¬ááœá±ááẠáááºážáááºážáá»á¬áž ááá·áºá¡á¬ážááœáá·áºááŒá¯áá¬ážáááºá
á¡áá¬ááá¹áá¯ááœá±ááᯠááá·áºáá²á·á¡áá« ObjectRepository áááºážááá¯á·á áá¯ááºááá¹áááá»á¬ážááᯠááŒá±á¬ááºážáá²ááẠá
á¬áááºážááœááºážááŸá¯áá
áºáá¯á¡á¬áž ááá·áºááœááºážáá¬ážáááºá ááá¯á·ááŒá±á¬áá·áº áá¯ááºááá¹áááá»á¬áž ááŒá±á¬ááºážáá²ááŸá¯ááá¯ááºážááẠá€á¡áá¬ááá¹áá¯ááᯠáá±ážáááºá
á¬áááºážááá¯á· áá±á«ááºážááá·áºááŒááºážááá¯áááºáž ááŒá
áºáá±á«áºá
á±áá«áááºá
ááŒááºáá០áá¯ááºááá¹áááá»á¬ážááᯠá¡ááºááááºáá¯ááºááŒááºážááẠPOCO á¡áá¬ááá¹áá¯áá
áºáá¯ááŸáá·áº á¡áá¯ááºáá¯ááºáá¯á¶ááŸáá·áº áá°áááº-
myParent.Children.First().Property = "Updated value";
á¡á±á¬ááºáá«áááºážáááºážáá»á¬ážááŒáá·áº á¡áá¬ááá¹áá¯áá áºáá¯ááᯠáá»ááºááá¯ááºáááº-
repository.Remove(myParent);
repository.RemoveRange(otherParents);
repository.Remove<ParentModel>(x => !x.Children.Any());
áááºážááẠá¡áá¬ááá¹áá¯á¡á¬áž áá»ááºáá±ážáááºážá á®ááá¯á·áááºáž ááá·áºáááºá
ááááºážáááºážááŒááºážá¡áá¯ááºá áááºááá¯áá²á
ObjectRepository á á±á¬áá·áºááŒáá·áºáá¬ážáá±á¬ á¡áá¬ááá¹áá¯áá»á¬áž ááŒá±á¬ááºážáá²áá±á¬á¡áá« (áá±á«ááºážááá·áºááŒááºáž ááá¯á·ááá¯áẠáá»ááºááŒááºáž ááá¯á·ááá¯áẠáá¯ááºááá¹áááá»á¬áž ááŒá±á¬ááºážáá²ááŒááºáž) ááẠááŒá áºáááºáá áºáá¯ááᯠáá±á«áºáá±á«ááºá á±áááºá áá¯á¶á á¶ááŒá±á¬ááºážáá¬ážáááºáá á¬áááºážááœááºážáá¬ážáááºá ááá¯ááŸá±á¬ááºááŸá¯. á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬áž ááá¯ááŸá±á¬ááºááŸá¯ á¡ááŒá áºá¡áá»ááºáá áºáá¯ááŒá áºáá±á«áºáá¬áá±á¬á¡áá« áá¯á¶á á¶ááŒá±á¬ááºážáá¬ážáááºá á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠááá·áºááœááºážáááºá á¡ááºááááºáá¯ááºáááºááŸáá·áº áá»ááºáááºá¡ááœáẠáááºážá á® 3 áá¯ááœáẠááá·áºááœááºážáá¬ážáááºá
á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááœá±áááºáž ááŸááááºá ááá¯ááŸá±á¬ááºááŸá¯ á áááºáá»áááºááœááºá áááºážááá¯á·ááẠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠ5 á áá¹ááá·áºááá¯ááºáž ááááºážáááºážá á±ááá·áº timer áá áºáá¯ááᯠáááºáá®ážáááºá
ááá¯á·á¡ááŒááºá ááááºážáááºážáá±á«áºááá¯ááŸá¯ááᯠá¡áááºážá¡ááŒááºááŒá¯áá¯ááºááẠAPI áá áºáá¯áááºáž ááŸááá«áááºá ObjectRepository.Save().
ááááºážáááºážááŸá¯áá áºáá¯á á®áááá¯ááºáá®ááœááºá á¡áááá¹áá«ááºáá²á·áá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá á®áááºážáá»á¬ážá០áŠážá áœá¬áááºááŸá¬ážááẠ(á¥ááá¬á á¡áá¬ááá¹áá¯áá áºáá¯á¡á¬áž ááŸá áºááŒáááºááŒá±á¬ááºážáá²ááá¯ááºáá±á¬á¡áá« ááá¯á·ááá¯áẠá¡ááŒááºáááºááá¯ážááŒááºáž/á¡áá¬ááá¹áá¯áá»á¬ážááᯠáááºááŸá¬ážááá¯ááºáá±á¬á¡áá«)á ááá¯á·áá±á¬ááºááŸáᬠáááºážááá¯ááºááá¯áẠááááºážáááºážáááºááŒá áºáááºá
ááá á¹á áááºááá¯ááºážááœááºá áááºááŸáá¡áá¬ááá¹áá¯áá áºáá¯áá¯á¶ážááᯠááááºážáááºážáá¬ážááŒá®ážá ááá¯á·ááŒá±á¬áá·áº áááºážááá¯á·ááᯠáááºážá á®ááá¯á·ááá·áºááá·áºá¡áá»áááºááœááºááẠááá¯ááá¯áá±á¬á¡áá¬ááá¹áá¯áá»á¬ážá áá¬ážááŸááºážá¡áá áºáá»á¬ážá¡áá«á¡ááẠá¡áá¬ááá¹áá¯áá»á¬ážááᯠáááºážááá¯á·ááŒá±á¬ááºážáá²áá¬ážáááºááẠááá°áá®áá±á¬á¡á á®á¡á á¥áºááŒáá·áº ááááºážáááºážáá¬ážááá¯ááºáááºá
áá±á¬ááºááẠáá¬ááŸááá±ážáá²á
- á á¬ááŒáá·áºááá¯ááºáá»á¬ážá¡á¬ážáá¯á¶ážááẠ.NET Standard 2.0 ááᯠá¡ááŒá±áá¶áá¬ážáááºá áááºááá·áºáá±ááºáá® .NET ááá±á¬áá»ááºááœááºáááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
- API ááẠthread áá¯á¶ááŒá¯á¶áááºá ááŒááºááœááºážá
á¯áá±á¬ááºážááŸá¯áá»á¬ážááᯠá¡ááŒá±áá¶á á¡áá±á¬ááºá¡áááºáá±á¬áº áá±á¬ááºááœááºáá»ááºááŸááááºá ááŒáá¯ááºáá°á¡áááá¬ááºááœá²ááá¯ááºááœááºáá°áá»á¬ážááœáẠáá±á¬á·áá»á¬ážááŸáááẠááá¯á·ááá¯áẠáááºážááá¯á·ááᯠáááá¯á¡ááºáá«á
ááááááá¯á· áá áºáá¯áááºážáá±á¬á¡áá¬á áá¯ááºážáááºááá¯á·áá«á ObjectRepository.Save(); - áááá¬ážá¡ááœáŸááºážáá»á¬áž (áá°ážááŒá¬ážááŸá¯ ááá¯á¡ááºáááº)
repository.Set<ChildModel>().AddIndex(x => x.Value);
repository.Set<ChildModel>().Find(x => x.Value, "myValue");
áááºáá°á áá¯á¶ážáá¬áá²á
ááá¯ááºááá¯ááºááá¯ááºáá»á áá«ááá¬áá«áá¬ááá±á¬áá»ááºá¡á¬ážáá¯á¶ážááœáẠá€áá»ááºážáááºáááºážááᯠá áááºá¡áá¯á¶ážááŒá¯áááŒááºážááŸá¬ á¡áááºááŒá±ááŒá®áž áá±áá¬á¡áá¯á¶ážááŒá¯ááœáá·áºá¡ááœáŸá¬áá áºáá¯áá±ážáá¬ážááŒááºáž ááá¯á·ááá¯áẠáá±ážáá¶áá±á¬á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœáẠááŒá®ážáá¬ážáá±á¬áá¯ááºáá»á ááááºáááá¯á¡ááºáá±á¬ááŒá±á¬áá·áºááŒá áºáááºá áá¯áá¹ááá¯ááºáá±ážá¡áá áá±áá¬ááᯠlitedb ááá¯á·ááá¯áẠááá¯ááºáá áºáá¯ááœáẠááááºážáááºážááŒááºážááẠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áá»áœááºá¯ááºá¡ááœáẠáá¯á¶áá±á¬ááºáá«áááºá
ááá¯á·áá±á¬áº ááááºá EscapeTeams (ááᯠáá»ááºááœá¬ážáá±á¬ startup) ááẠááááºáááá®áá±áá¬ááŸá¬ ááá¯ááºáá¶ááá¯á·áááºáá²á·áá±áá²á· ááá¯ááºáá°ážá áááºááŒá®áž ááŒá¯á¶áá¬ááááºá) - Azure Table Storage ááœáẠáá±áá¬ááááºážáááºážááẠá¡áá¯á¶ážááŒá¯áááºá
á¡áá¬ááá»á¡ááŸáá»á¡á á®á¡á áá»ááŒá¬áž
á€áá»ááºážáááºááŸá¯á á¡ááá á¡á¬ážáááºážáá»ááºáá»á¬ážáá²á០áá áºáá¯ááᯠááŒááºáááºááá¯ááẠ- á¡áá»á¬ážááá¯áẠá¡ááá¯ááºážá¡áᬠáá»á²á·ááœááºááŒááºážá áááºážááá¯áá¯ááºáá±á¬ááºáááºá ááŒáá·áºáá±áá¬ážáá±á¬ ááœá±áá±ážááœá±áá°áá»á¬áž (sic!) ááá¯á·ááá¯áẠááá°áá®áá±á¬ááŒá áºáááºáá»á¬ážá០áá°áá®áá±á¬áá±áá¬ááᯠáááŒá±á¬ááºážáá²ááá·áºááŒá±á¬ááºáž á á±ááá¬á¡áá»á±á¬áẠáá¯á¶ážááŒááºáá»ááºáá»áá« ááá¯á·ááá¯áẠâáá±á¬ááºáá¯á¶ážáá±á¬áá°ááẠááŸááºáááºâ áá°áá±á¬áá°á¡á áááºážááá¯á·ááᯠááŒá±á¬ááºážáá²ááœáá·áºááŒá¯áá«á
áááºážááá¬ááŸá¯áá±á¬áá·áºááŸááŒáá·áºáá»áŸáẠá¡á±á¬ááºáá«á¡á á®á¡á á¥áºááᯠáááºááá¯ááºááá»áŸááŒááºáá«áááºá
- á¡áá¬ááá¹áá¯áá±á¬áºáááºá¡á á¬áž EventLog ááŸáá·áº Snapshot ááᯠááááºážáááºážáá«á
- á¡ááŒá¬ážááŒá áºáááºáá»á¬ážááᯠááŸá¬áá« (áááºáááºáá»á¬ážááœáẠááŒá áºáááºá¡á¬ážáá¯á¶ážá á¡áá¯á¶ážááŸááºáá»á¬ážááᯠáá±á«ááºážááá·áºááá¬áž? udp ááŸá¬ááœá±ááœá±á·ááŸáááŸá¯? master/slave?)
- EventLog ááŒá áºáááºáá»á¬ážááŒá¬ážááœáẠRAFT áá²á·ááá¯á·áá±á¬ á¡áá»á¬ážááá±á¬áá°áá±á¬ á¡ááºáááá¯áá®áááºáá áºáá¯á០áá áºááá·áº áá°ážáá°áá«á
áá»áœááºá¯ááºááᯠá áá¯ážááááºáá±á¬ áá±á¬ááºáááºááŒá¿áá¬áá áºáᯠááŸááá±ážááẠ- áááºáááẠáá»ááºááŒááºáž ááá¯á·ááá¯áẠá¡ááŒá¬ážá¡áá¬ááá¹áá¯áá»á¬ážá០ááá·áºááºáá»á¬ážááŸáááá·áº á¡áá¬ááá¹áá¯áá»á¬ážááᯠáá»ááºááŒááºážááá á¹á áá»á¬ážááᯠááŸá¬ááœá±ááœá±á·ááŸáááŒááºážá
á¡áááºážá¡ááŒá áº
á€áá±áá¬ááá¯á· áááºáááºááŸá¯ááŒá®ážáá«á áá»ááºá¡áá¬á¡á¬ážáá¯á¶ážááŸá¬ áá¯ááºááá¯áááºáááºááŒá
áºáááºá áááºážááᯠGitHub ááœáẠááŸá¬ááœá±á·ááá¯ááºáááº-
source: www.habr.com