рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛрдб рдлрд░реНрд╕реНрдЯ рдкрд░ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рд▓реЗрдпрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛





рдирдорд╕реНрддреЗ!



рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ, рдореИрдВ рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рд╕реНрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдлрд┐рд░ рдИрдПрдл, рдХреНрдпрд╛ рдХрд╛рд░реНрдп рдереЗ рдФрд░ рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред рдкреЛрд╕реНрдЯ рд╕реЗ рд╕рднреА рд╕рдмрдорд┐рдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб, рд╕рд╛рде рд╣реА рд╕рдВрд▓рдЧреНрди рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рд▓рд┐рдмрд░рд▓ рдПрдордЖрдИрдЯреА рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЖрдк рдЬреИрд╕реЗ рдЪрд╛рд╣реЗрдВ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рддреБрд░рдВрдд рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рд╕реНрддреБрдд рдкреВрд░рд╛ рдХреЛрдб рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рд╣реИ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ 2 рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдПрдХ рдмрдбрд╝реА рд░реВрд╕реА рдХрдВрдкрдиреА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЕрддреНрдпрдзрд┐рдХ рд▓реЛрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред



рдХрдЯ рдХреЗ рддрд╣рдд рд╡рд┐рд╡рд░рдгред



рдХрд╛рд░реНрдп


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрддреЗ рд╕рдордп, рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рд▓реЗрдпрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдХрдИ рдХрд╛рд░реНрдп рдереЗ:

1. рд╕рднреА рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рджреАред

2. рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

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

рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛:

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, EF рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ NHibernate рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдЪрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреНрд░рд┐рдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдВрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдХреЛ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдпрджрд┐ рдпреЗ рджреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрджрд░реНрдн рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВ, рддреЛ EF рджреЛрдиреЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдмрдЪрд╛рдПрдЧрд╛ред



рдирд┐рд░реНрдгрдп


рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВред

рд╢рд╛рдпрдж рдореИрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ - рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрджрд░реНрднред

рдорд╛рдирдХ рдФрд░ рд╕рд░рд▓реАрдХреГрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ:

UsersContext
namespace TestApp.Models { public partial class UsersContext : DbContext { public UsersContext() : base("Name=UsersContext") { } public DbSet<User> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new UserMap()); } } }
      
      







рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдмрдврд╝рд╛рдПрдБ:

IDbContext
  public interface IDbContext { IQueryable<T> Find<T>() where T : class; void MarkAsAdded<T>(T entity) where T : class; void MarkAsDeleted<T>(T entity) where T : class; void MarkAsModified<T>(T entity) where T : class; void Commit(bool withLogging); //      void Rollback(); //       void EnableTracking(bool isEnable); EntityState GetEntityState<T>(T entity) where T : class; void SetEntityState<T>(T entity, EntityState state) where T : class; //         DbChangeTracker GetChangeTracker(); DbEntityEntry GetDbEntry<T>(T entity) where T : class; }
      
      







рдкрд░рд┐рдгрд╛рдореА рд╕рдВрд╢реЛрдзрд┐рдд DbContext:

DemoAppDbContext
 namespace DataAccess.DbContexts { public class DemoAppDbContext : DbContext, IDbContext { public static User CurrentUser { get; set; } private readonly ILogger _logger; #region Context Entities public DbSet<EntityChange> EntityChanges { get; set; } public DbSet<User> Users { get; set; } #endregion static DemoAppDbContext() { //  Database.SetInitializer(new CreateDBContextInitializer()); } //       public static void Seed(DemoAppDbContext context) { //     var defaultUser = new User { Email = "UserEmail@email.ru", Login = "login", IsBlocked = false, Name = "Vasy Pupkin" }; context.Users.Add(defaultUser); context.SaveChanges(); } public DemoAppDbContext(string nameOrConnectionString) : base(nameOrConnectionString) { //   _logger = new Logger(this); } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new EntityChangeMap()); modelBuilder.Configurations.Add(new UserMap()); } public void MarkAsAdded<T>(T entity) where T : class { Entry(entity).State = EntityState.Added; Set<T>().Add(entity); } public void MarkAsDeleted<T>(T entity) where T : class { Attach(entity); Entry(entity).State = EntityState.Deleted; Set<T>().Remove(entity); } public void MarkAsModified<T>(T entity) where T : class { Attach(entity); Entry(entity).State = EntityState.Modified; } public void Attach<T>(T entity) where T : class { if (Entry(entity).State == EntityState.Detached) { Set<T>().Attach(entity); } } public void Commit(bool withLogging) { BeforeCommit(); if (withLogging) { _logger.Run(); } SaveChanges(); } private void BeforeCommit() { UndoExistAddedEntitys(); } // ,      ,        private void UndoExistAddedEntitys() { IEnumerable<DbEntityEntry> dbEntityEntries = GetChangeTracker().Entries().Where(x => x.State == EntityState.Added); foreach (var dbEntityEntry in dbEntityEntries) { if (GetKeyValue(dbEntityEntry.Entity) > 0) { SetEntityState(dbEntityEntry.Entity, EntityState.Unchanged); } } } //      public void Rollback() { ChangeTracker.Entries().ToList().ForEach(x => x.Reload()); } public void EnableTracking(bool isEnable) { Configuration.AutoDetectChangesEnabled = isEnable; } public void SetEntityState<T>(T entity, EntityState state) where T : class { Entry(entity).State = state; } public DbChangeTracker GetChangeTracker() { return ChangeTracker; } public EntityState GetEntityState<T>(T entity) where T : class { return Entry(entity).State; } public IQueryable<T> Find<T>() where T : class { return Set<T>(); } public DbEntityEntry GetDbEntry<T>(T entity) where T : class { return Entry(entity); } public static int GetKeyValue<T>(T entity) where T : class { var dbEntity = entity as IDbEntity; if (dbEntity == null) throw new ArgumentException("Entity should be IDbEntity type - " + entity.GetType().Name); return dbEntity.GetPrimaryKey(); } } }
      
      







рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рд╕рднреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рд╡рд╛рд░рд┐рд╕ рд╣реИ рдЬреЛ рдореВрд▓ CRUD рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ

IRepository
  interface IRepository<T> where T : class { DemoAppDbContext CreateDatabaseContext(); List<T> GetAll(); T Find(int entityId); T SaveOrUpdate(T entity); T Add(T entity); T Update(T entity); void Delete(T entity); //    DbEntityValidationResult Validate(T entity); //     string ValidateAndReturnErrorString(T entity, out bool isValid); }
      
      







IRepository рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

BaseRepository
 namespace DataAccess.Repositories { public abstract class BaseRepository<T> : IRepository<T> where T : class { private readonly IContextManager _contextManager; protected BaseRepository(IContextManager contextManager) { _contextManager = contextManager; } public DbEntityValidationResult Validate(T entity) { using (var context = CreateDatabaseContext()) { return context.Entry(entity).GetValidationResult(); } } public string ValidateAndReturnErrorString(T entity, out bool isValid) { using (var context = CreateDatabaseContext()) { DbEntityValidationResult dbEntityValidationResult = context.Entry(entity).GetValidationResult(); isValid = dbEntityValidationResult.IsValid; if (!dbEntityValidationResult.IsValid) { return DbValidationMessageParser.GetErrorMessage(dbEntityValidationResult); } return string.Empty; } } //    .   using public DemoAppDbContext CreateDatabaseContext() { return _contextManager.CreateDatabaseContext(); } public List<T> GetAll() { using (var context = CreateDatabaseContext()) { return context.Set<T>().ToList(); } } public T Find(int entityId) { using (var context = CreateDatabaseContext()) { return context.Set<T>().Find(entityId); } } //  .    ,       protected virtual void BeforeSave(T entity, DemoAppDbContext db) { } public T SaveOrUpdate(T entity) { var iDbEntity = entity as IDbEntity; if (iDbEntity == null) throw new ArgumentException("entity should be IDbEntity type", "entity"); return iDbEntity.GetPrimaryKey() == 0 ? Add(entity) : Update(entity); } public T Add(T entity) { using (var context = CreateDatabaseContext()) { BeforeSave(entity, context); context.MarkAsAdded(entity); context.Commit(true); } return entity; } public T Update(T entity) { using (var context = CreateDatabaseContext()) { var iDbEntity = entity as IDbEntity; if (iDbEntity == null) throw new ArgumentException("entity should be IDbEntity type", "entity"); var attachedEntity = context.Set<T>().Find(iDbEntity.GetPrimaryKey()); context.Entry(attachedEntity).CurrentValues.SetValues(entity); BeforeSave(attachedEntity, context); context.Commit(true); } return entity; } public void Delete(T entity) { using (var context = CreateDatabaseContext()) { context.MarkAsDeleted(entity); context.Commit(true); } } } }
      
      







рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ:

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
 namespace DataAccess.Models { public class User : IDbEntity { public User() { this.EntityChanges = new List<EntityChange>(); } public int UserId { get; set; } [Required(AllowEmptyStrings = false, ErrorMessage = @"Please input Login")] [StringLength(50, ErrorMessage = @"Login    50- ")] public string Login { get; set; } [Required(AllowEmptyStrings = false, ErrorMessage = @"Please input Email")] [StringLength(50, ErrorMessage = @"Email    50- ")] public string Email { get; set; } [Required(AllowEmptyStrings = false, ErrorMessage = @"Please input Name")] [StringLength(50, ErrorMessage = @"    50- ")] public string Name { get; set; } public bool IsBlocked { get; set; } public virtual ICollection<EntityChange> EntityChanges { get; set; } public override string ToString() { return string.Format(": User; :{0}, UserId:{1} ", Name, UserId); } public int GetPrimaryKey() { return UserId; } } }
      
      







"рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА, рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдорд╛рдирдХ CRUD рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ:

UsersRepository
 namespace DataAccess.Repositories { public class UsersRepository : BaseRepository<User> { public UsersRepository(IContextManager contextManager) : base(contextManager) { } public User FindByLogin(string login) { using (var db = CreateDatabaseContext()) { return db.Set<User>().FirstOrDefault(u => u.Login == login); } } public bool ExistUser(string login) { using (var db = CreateDatabaseContext()) { return db.Set<User>().Count(u => u.Login == login) > 0; } } public User GetByUserId(int userId) { using (var db = CreateDatabaseContext()) { return db.Set<User>().SingleOrDefault(c => c.UserId == userId); } } public User GetFirst() { using (var db = CreateDatabaseContext()) { return db.Set<User>().First(); } } } }
      
      







рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рднреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдПрдХ рдмрд╛рд░ рдЖрд░рдореНрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рд╕реЗрд╡рд╛ рд▓реЛрдХреЗрдЯрд░ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реАрдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред

RepositoryContainer
 namespace DataAccess.Container { public class RepositoryContainer { private readonly IContainer _repositoryContainer = new Container(); public static readonly RepositoryContainer Instance = new RepositoryContainer(); private RepositoryContainer() { } public T Resolve<T>() where T : class { return _repositoryContainer.Resolve<T>(); } public void Register<T>(T entity) where T : class { _repositoryContainer.Register(entity); } } } namespace DataAccess.Container { public static class RepositoryContainerFactory { public static void RegisterAllRepositories(IContextManager dbContext) { RepositoryContainer.Instance.Register(dbContext); RepositoryContainer.Instance.Register(new EntityChangesRepository(dbContext)); RepositoryContainer.Instance.Register(new UsersRepository(dbContext)); } } }
      
      







рд╕рднреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд▓рд┐рдП, рдПрдХ IContextManager рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдХрдИ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреЗрдВрджреНрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

IContextManager
 namespace DataAccess.Interfaces { public interface IContextManager { DemoAppDbContext CreateDatabaseContext(); } }
      
      







рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рд╕рдВрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

ContextManager
 using DataAccess.Interfaces; namespace DataAccess.DbContexts { public class ContextManager : IContextManager { private readonly string _connectionString; public ContextManager(string connectionString) { _connectionString = connectionString; } public DemoAppDbContext CreateDatabaseContext() { return new DemoAppDbContext(_connectionString); } } }
      
      







рд▓реЙрдЧрд┐рдВрдЧ рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рд╣реЛрддреА рд╣реИ рдЬреЛ ILogger рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ:

ILogger
 namespace DataAccess.Interfaces { internal interface ILogger { void Run(); } }
      
      







ILogger рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛

рд▓рдХрдбрд╝рд╣рд╛рд░рд╛
  public class Logger : ILogger { Dictionary<EntityState, string> _operationTypes; private readonly IDbContext _dbContext; public Logger(IDbContext dbContext) { _dbContext = dbContext; InitOperationTypes(); } public void Run() { LogChangedEntities(EntityState.Added); LogChangedEntities(EntityState.Modified); LogChangedEntities(EntityState.Deleted); } private void InitOperationTypes() { _operationTypes = new Dictionary<EntityState, string> { {EntityState.Added, ""}, {EntityState.Deleted, ""}, {EntityState.Modified, ""} }; } private string GetOperationName(EntityState entityState) { return _operationTypes[entityState]; } private void LogChangedEntities(EntityState entityState) { IEnumerable<DbEntityEntry> dbEntityEntries = _dbContext.GetChangeTracker().Entries().Where(x => x.State == entityState); foreach (var dbEntityEntry in dbEntityEntries) { LogChangedEntitie(dbEntityEntry, entityState); } } private void LogChangedEntitie(DbEntityEntry dbEntityEntry, EntityState entityState) { string operationHash = HashGenerator.GenerateHash(10); int enitityId = DemoAppDbContext.GetKeyValue(dbEntityEntry.Entity); Type type = dbEntityEntry.Entity.GetType(); IEnumerable<string> propertyNames = entityState == EntityState.Deleted ? dbEntityEntry.OriginalValues.PropertyNames : dbEntityEntry.CurrentValues.PropertyNames; foreach (var propertyName in propertyNames) { DbPropertyEntry property = dbEntityEntry.Property(propertyName); if (entityState == EntityState.Modified && !property.IsModified) continue; _dbContext.MarkAsAdded(new EntityChange { UserId = DemoAppDbContext.CurrentUser.UserId, Created = DateTime.Now, OperationHash = operationHash, EntityName = string.Empty, EntityType = type.ToString(), EntityId = enitityId.ToString(), PropertyName = propertyName, OriginalValue = entityState != EntityState.Added && property.OriginalValue != null ? property.OriginalValue.ToString() : string.Empty, ModifyValue = entityState != EntityState.Deleted && property.CurrentValue != null ? property.CurrentValue.ToString() : string.Empty, OperationType = GetOperationName(entityState), }); } } }
      
      







рдХреЗ рдЙрдкрдпреЛрдЧ


рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрд╡реЗрджрди рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдлреИрдХреНрдЯреНрд░реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

 RepositoryContainerFactory.RegisterAllRepositories(new ContextManager(Settings.Default.DBConnectionString));
      
      





рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдФрд░ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рд╣реИред рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдпрд╣ рдмрд┐рдВрджреБ рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

InitDefaultUser
 private void InitDefaultUser() { User defaultUser = RepositoryContainer.Instance.Resolve<UsersRepository>().GetFirst(); DemoAppDbContext.CurrentUser = defaultUser; }
      
      







рд╕реЗрд╡рд╛ рд▓реЛрдХреЗрдЯрд░-рдП рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЙрд▓ GetRirst () рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рд░рд┐рдкреНрд░реЗрдЬреЗрдВрдЯрд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ:

 User defaultUser = RepositoryContainer.Instance.Resolve<UsersRepository>().GetFirst();
      
      





рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝рдирд╛:

 var newUser = new User { Email = "UserEmail@email.ru", Login = "login", IsBlocked = false, Name = "Vasy Pupkin"}; RepositoryContainer.Instance.Resolve<UsersRepository>().SaveOrUpdate(newUser);
      
      





рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдорд╛рдиреНрдпрддрд╛


рд╕рддреНрдпрд╛рдкрди рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:

 var newUser = new User { Email = "UserEmail@email.ru", IsBlocked = false, }; DbEntityValidationResult dbEntityValidationResult = RepositoryContainer.Instance.Resolve<UsersRepository>().Validate(newUser);
      
      





рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд╛рдЗрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:

 var newUser = new User { Email = "UserEmail@email.ru", IsBlocked = false, }; bool isValid=true; string errors = RepositoryContainer.Instance.Resolve<UsersRepository>().ValidateAndReturnErrorString(newUser, out isValid); if (!isValid) { MessageBox.Show(errors, "Error..", MessageBoxButtons.OK, MessageBoxIcon.Error); }
      
      





рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ


рдЖрдк рдпрд╛рдВрдбреЗрдХреНрд╕ рдбреНрд░рд╛рдЗрд╡ http://yadi.sk/d/P9XDDznpMj6p8 рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдорд╕реМрджреЗ рдХреЛ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдерд╛рдкрд┐рдд MSSQL DBMS рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

MSSQL рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

  <value>Data Source=.\; Initial Catalog=EFDemoApp; Integrated Security=True; Connection Timeout=5</value>
      
      





рдкрд░

  <value>Data Source=.\SQLEXPRESS; Initial Catalog=EFDemoApp; Integrated Security=True; Connection Timeout=5</value>
      
      





рдЕрдВрддрднрд╛рд╖рдг


рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛрдб рдореЗрд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдпрд╣ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд┐рд╕реА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдПрдХ рд╕рдордп рдкрд░, рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд░рд┐рдгрд╛рдо рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред



рдЖрдк рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж!



All Articles