Veikedo

Untitled

Apr 4th, 2016
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.61 KB | None | 0 0
  1. namespace RedFood.Dal
  2. {
  3.     public interface IAppDbContext
  4.     {
  5.         DbSet<User> Users { get; }
  6.         DbSet<Competition> Competitions { get; }
  7.         DbSet<Question> Questions { get; }
  8.         DbSet<Answer> Answers { get; }
  9.         DbSet<Variant> Variants { get; }
  10.         DbSet<UserCompetition> UserCompetitions { get; }
  11.         Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken));
  12.         Task<ITransaction> BeginTransactionAsync();
  13.         void UpdateRange<T>(params T[] entities) where T : class;
  14.         void Update<TEntity>(TEntity entity) where TEntity : class;
  15.         void RemoveEntity<TEntity>(TEntity entity) where TEntity : class;
  16.         void RemoveRangeEntities<T>(IEnumerable<T> entities) where T : class;
  17.     }
  18.  
  19.     public interface ITransaction : IDisposable
  20.     {
  21.         void CommitTransaction();
  22.         void RollbackTransaction();
  23.     }
  24.  
  25.     public class AppDbContext : DbContext, IAppDbContext
  26.     {
  27.         public DbSet<Question> Questions { get; set; }
  28.         public DbSet<Answer> Answers { get; set; }
  29.         public DbSet<Variant> Variants { get; set; }
  30.         public DbSet<UserCompetition> UserCompetitions { get; set; }
  31.  
  32.         async Task<ITransaction> IAppDbContext.BeginTransactionAsync()
  33.         {
  34.             var transaction = await Database.BeginTransactionAsync().ConfigureAwait(false);
  35.             return new DisposableTransaction(transaction);
  36.         }
  37.  
  38.         public void UpdateRange<T>(params T[] entities) where T : class
  39.         {
  40.             foreach (var entity in entities)
  41.             {
  42.                 Update(entity);
  43.             }
  44.         }
  45.  
  46.         public void Update<TEntity>(TEntity entity) where TEntity : class
  47.         {
  48.             base.Update(entity, GraphBehavior.SingleObject);
  49.         }
  50.  
  51.         public void RemoveEntity<TEntity>(TEntity entity) where TEntity : class
  52.         {
  53.             Remove(entity);
  54.         }
  55.  
  56.         public void RemoveRangeEntities<T>(IEnumerable<T> entities) where T : class
  57.         {
  58.             RemoveRange(entities);
  59.         }
  60.  
  61.         public DbSet<User> Users { get; set; }
  62.         public DbSet<Competition> Competitions { get; set; }
  63.  
  64.         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  65.         {
  66.             var configuration = new ConfigurationBuilder()
  67.                 .AddJsonFile("appsettings.json")
  68.                 .Build();
  69.  
  70.             optionsBuilder.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"]);
  71.         }
  72.  
  73.         protected override void OnModelCreating(ModelBuilder modelBuilder)
  74.         {
  75.             modelBuilder.Entity<Answer>()
  76.                 .HasKey(a => new {a.QuestionId, a.VariantId});
  77.  
  78.             modelBuilder.Entity<Question>()
  79.                 .HasOne(q => q.CorrectVariant)
  80.                 .WithOne(v => v.Question)
  81.                 .HasForeignKey<Question>(q => q.CorrectVariantId);
  82.  
  83.             modelBuilder.Entity<Variant>()
  84.                 .HasOne(v => v.Question)
  85.                 .WithMany(a => a.Variants)
  86.                 .OnDelete(DeleteBehavior.Cascade);
  87.  
  88.             modelBuilder.Entity<UserCompetition>()
  89.                 .HasKey(uc => new {uc.UserId, uc.CompetitionId});
  90.  
  91.             modelBuilder.Entity<UserCompetition>()
  92.                 .HasOne(wc => wc.Competition)
  93.                 .WithMany(c => c.Users)
  94.                 .HasForeignKey(wc => wc.CompetitionId);
  95.  
  96.             modelBuilder.Entity<UserCompetition>()
  97.                 .HasOne(wc => wc.User)
  98.                 .WithMany(u => u.Competitions)
  99.                 .HasForeignKey(wc => wc.UserId);
  100.         }
  101.  
  102.         private class DisposableTransaction : ITransaction
  103.         {
  104.             private readonly IRelationalTransaction _transaction;
  105.             private bool _commited;
  106.             private bool _disposed;
  107.  
  108.             public DisposableTransaction(IRelationalTransaction transaction)
  109.             {
  110.                 _transaction = transaction;
  111.             }
  112.  
  113.             public void Dispose()
  114.             {
  115.                 if (_disposed)
  116.                 {
  117.                     return;
  118.                 }
  119.  
  120.                 _disposed = true;
  121.                 if (!_commited)
  122.                 {
  123.                     _transaction.Rollback();
  124.                 }
  125.  
  126.                 _transaction.Dispose();
  127.             }
  128.  
  129.             public void CommitTransaction()
  130.             {
  131.                 _commited = true;
  132.                 _transaction.Commit();
  133.             }
  134.  
  135.             public void RollbackTransaction()
  136.             {
  137.                 _transaction.Rollback();
  138.             }
  139.         }
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment