Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
hikalkan committed Aug 4, 2017
2 parents 68a1183 + 4b56ebc commit 7ffc97c
Show file tree
Hide file tree
Showing 25 changed files with 239 additions and 109 deletions.
2 changes: 1 addition & 1 deletion common.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>2.2.2</Version>
<Version>2.3.0</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<PackageIconUrl>http://www.aspnetboilerplate.com/images/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>http://www.aspnetboilerplate.com/</PackageProjectUrl>
Expand Down
3 changes: 2 additions & 1 deletion doc/WebSite/Background-Jobs-And-Workers.html
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ <h4>Create a Background Job</h4>
_userRepository = userRepository;
_emailSender = emailSender;
}


[UnitOfWork]
public override void <strong>Execute</strong>(SimpleSendEmailJobArgs args)
{
var senderUser = _userRepository.Get(args.SenderUserId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionE
using (AbpCrossCuttingConcerns.Applying(context.Controller, AbpCrossCuttingConcerns.Auditing))
{
var auditInfo = _auditingHelper.CreateAuditInfo(
context.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType(),
context.ActionDescriptor.AsControllerActionDescriptor().MethodInfo,
context.ActionArguments
);
Expand Down
2 changes: 1 addition & 1 deletion src/Abp.AutoMapper/Abp.AutoMapper.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="AutoMapper" Version="6.1.0" />
<PackageReference Include="AutoMapper" Version="6.1.1" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net46' ">
Expand Down
2 changes: 1 addition & 1 deletion src/Abp.EntityFramework/Abp.EntityFramework.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

<ItemGroup>
<PackageReference Include="EntityFramework" Version="6.1.3" />
<PackageReference Include="EntityFramework.DynamicFilters" Version="2.7.0" />
<PackageReference Include="EntityFramework.DynamicFilters" Version="2.10.0" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net46' ">
Expand Down
124 changes: 77 additions & 47 deletions src/Abp.EntityFramework/EntityFramework/AbpDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -145,15 +145,16 @@ private void InitializeDbContext()

private void RegisterToChanges()
{
((IObjectContextAdapter)this)
((IObjectContextAdapter) this)
.ObjectContext
.ObjectStateManager
.ObjectStateManagerChanged += ObjectStateManager_ObjectStateManagerChanged;
}

protected virtual void ObjectStateManager_ObjectStateManagerChanged(object sender, System.ComponentModel.CollectionChangeEventArgs e)
protected virtual void ObjectStateManager_ObjectStateManagerChanged(object sender,
System.ComponentModel.CollectionChangeEventArgs e)
{
var contextAdapter = (IObjectContextAdapter)this;
var contextAdapter = (IObjectContextAdapter) this;
if (e.Action != CollectionChangeAction.Add)
{
return;
Expand All @@ -167,9 +168,9 @@ protected virtual void ObjectStateManager_ObjectStateManagerChanged(object sende
CheckAndSetMustHaveTenantIdProperty(entry.Entity);
SetCreationAuditProperties(entry.Entity, GetAuditUserId());
break;
//case EntityState.Deleted: //It's not going here at all
// SetDeletionAuditProperties(entry.Entity, GetAuditUserId());
// break;
//case EntityState.Deleted: //It's not going here at all
// SetDeletionAuditProperties(entry.Entity, GetAuditUserId());
// break;
}
}

Expand All @@ -185,16 +186,21 @@ private void SetNullsForInjectedProperties()
public virtual void Initialize()
{
Database.Initialize(false);
this.SetFilterScopedParameterValue(AbpDataFilters.MustHaveTenant, AbpDataFilters.Parameters.TenantId, AbpSession.TenantId ?? 0);
this.SetFilterScopedParameterValue(AbpDataFilters.MayHaveTenant, AbpDataFilters.Parameters.TenantId, AbpSession.TenantId);
this.SetFilterScopedParameterValue(AbpDataFilters.MustHaveTenant, AbpDataFilters.Parameters.TenantId,
AbpSession.TenantId ?? 0);
this.SetFilterScopedParameterValue(AbpDataFilters.MayHaveTenant, AbpDataFilters.Parameters.TenantId,
AbpSession.TenantId);
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Filter(AbpDataFilters.SoftDelete, (ISoftDelete d) => d.IsDeleted, false);
modelBuilder.Filter(AbpDataFilters.MustHaveTenant, (IMustHaveTenant t, int tenantId) => t.TenantId == tenantId || (int?)t.TenantId == null, 0); //While "(int?)t.TenantId == null" seems wrong, it's needed. See https://github.com/jcachat/EntityFramework.DynamicFilters/issues/62#issuecomment-208198058
modelBuilder.Filter(AbpDataFilters.MayHaveTenant, (IMayHaveTenant t, int? tenantId) => t.TenantId == tenantId, 0);
modelBuilder.Filter(AbpDataFilters.MustHaveTenant,
(IMustHaveTenant t, int tenantId) => t.TenantId == tenantId || (int?) t.TenantId == null,
0); //While "(int?)t.TenantId == null" seems wrong, it's needed. See https://github.com/jcachat/EntityFramework.DynamicFilters/issues/62#issuecomment-208198058
modelBuilder.Filter(AbpDataFilters.MayHaveTenant,
(IMayHaveTenant t, int? tenantId) => t.TenantId == tenantId, 0);
}

public override int SaveChanges()
Expand Down Expand Up @@ -235,44 +241,63 @@ protected virtual EntityChangeReport ApplyAbpConcepts()

var userId = GetAuditUserId();

var entries = ChangeTracker.Entries().ToList();
foreach (var entry in entries)
foreach (var entry in ChangeTracker.Entries().ToList())
{
switch (entry.State)
{
case EntityState.Added:
CheckAndSetId(entry.Entity);
CheckAndSetMustHaveTenantIdProperty(entry.Entity);
CheckAndSetMayHaveTenantIdProperty(entry.Entity);
SetCreationAuditProperties(entry.Entity, userId);
changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Created));
break;
case EntityState.Modified:
SetModificationAuditProperties(entry.Entity, userId);
if (entry.Entity is ISoftDelete && entry.Entity.As<ISoftDelete>().IsDeleted)
{
SetDeletionAuditProperties(entry.Entity, userId);
changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Deleted));
}
else
{
changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Updated));
}

break;
case EntityState.Deleted:
CancelDeletionForSoftDelete(entry);
SetDeletionAuditProperties(entry.Entity, userId);
changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Deleted));
break;
}

AddDomainEvents(changeReport.DomainEvents, entry.Entity);
ApplyAbpConcepts(entry, userId, changeReport);
}

return changeReport;
}

protected virtual void ApplyAbpConcepts(DbEntityEntry entry, long? userId, EntityChangeReport changeReport)
{
switch (entry.State)
{
case EntityState.Added:
ApplyAbpConceptsForAddedEntity(entry, userId, changeReport);
break;
case EntityState.Modified:
ApplyAbpConceptsForModifiedEntity(entry, userId, changeReport);
break;
case EntityState.Deleted:
ApplyAbpConceptsForDeletedEntity(entry, userId, changeReport);
break;
}

AddDomainEvents(changeReport.DomainEvents, entry.Entity);
}

protected virtual void ApplyAbpConceptsForAddedEntity(DbEntityEntry entry, long? userId, EntityChangeReport changeReport)
{
CheckAndSetId(entry.Entity);
CheckAndSetMustHaveTenantIdProperty(entry.Entity);
CheckAndSetMayHaveTenantIdProperty(entry.Entity);
SetCreationAuditProperties(entry.Entity, userId);
changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Created));
}

protected virtual void ApplyAbpConceptsForModifiedEntity(DbEntityEntry entry, long? userId, EntityChangeReport changeReport)
{
SetModificationAuditProperties(entry.Entity, userId);

if (entry.Entity is ISoftDelete && entry.Entity.As<ISoftDelete>().IsDeleted)
{
SetDeletionAuditProperties(entry.Entity, userId);
changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Deleted));
}
else
{
changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Updated));
}
}

protected virtual void ApplyAbpConceptsForDeletedEntity(DbEntityEntry entry, long? userId, EntityChangeReport changeReport)
{
CancelDeletionForSoftDelete(entry);
SetDeletionAuditProperties(entry.Entity, userId);
changeReport.ChangedEntities.Add(new EntityChangeEntry(entry.Entity, EntityChangeType.Deleted));
}

protected virtual void AddDomainEvents(List<DomainEventEntry> domainEvents, object entityAsObj)
{
var generatesDomainEventsEntity = entityAsObj as IGeneratesDomainEvents;
Expand All @@ -286,7 +311,9 @@ protected virtual void AddDomainEvents(List<DomainEventEntry> domainEvents, obje
return;
}

domainEvents.AddRange(generatesDomainEventsEntity.DomainEvents.Select(eventData => new DomainEventEntry(entityAsObj, eventData)));
domainEvents.AddRange(
generatesDomainEventsEntity.DomainEvents.Select(
eventData => new DomainEventEntry(entityAsObj, eventData)));
generatesDomainEventsEntity.DomainEvents.Clear();
}

Expand All @@ -298,7 +325,8 @@ protected virtual void CheckAndSetId(object entityAsObj)
{
var entityType = ObjectContext.GetObjectType(entityAsObj.GetType());
var idProperty = entityType.GetProperty("Id");
var dbGeneratedAttr = ReflectionHelper.GetSingleAttributeOrDefault<DatabaseGeneratedAttribute>(idProperty);
var dbGeneratedAttr =
ReflectionHelper.GetSingleAttributeOrDefault<DatabaseGeneratedAttribute>(idProperty);
if (dbGeneratedAttr == null || dbGeneratedAttr.DatabaseGeneratedOption == DatabaseGeneratedOption.None)
{
entity.Id = GuidGenerator.Create();
Expand Down Expand Up @@ -377,12 +405,14 @@ protected virtual void CheckAndSetMayHaveTenantIdProperty(object entityAsObj)

protected virtual void SetCreationAuditProperties(object entityAsObj, long? userId)
{
EntityAuditingHelper.SetCreationAuditProperties(MultiTenancyConfig, entityAsObj, AbpSession.TenantId, userId);
EntityAuditingHelper.SetCreationAuditProperties(MultiTenancyConfig, entityAsObj, AbpSession.TenantId,
userId);
}

protected virtual void SetModificationAuditProperties(object entityAsObj, long? userId)
{
EntityAuditingHelper.SetModificationAuditProperties(MultiTenancyConfig, entityAsObj, AbpSession.TenantId, userId);
EntityAuditingHelper.SetModificationAuditProperties(MultiTenancyConfig, entityAsObj, AbpSession.TenantId,
userId);
}

protected virtual void CancelDeletionForSoftDelete(DbEntityEntry entry)
Expand Down Expand Up @@ -478,4 +508,4 @@ protected virtual void LogDbEntityValidationException(DbEntityValidationExceptio
return AbpSession.TenantId;
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Abp.Collections.Extensions;
using Abp.Data;
using Abp.Domain.Entities;
using Abp.Domain.Repositories;

Expand All @@ -23,15 +26,44 @@ public class EfRepositoryBase<TDbContext, TEntity, TPrimaryKey> : AbpRepositoryB
/// <summary>
/// Gets EF DbContext object.
/// </summary>
public virtual TDbContext Context { get { return _dbContextProvider.GetDbContext(MultiTenancySide); } }
public virtual TDbContext Context => _dbContextProvider.GetDbContext(MultiTenancySide);

/// <summary>
/// Gets DbSet for given entity.
/// </summary>
public virtual DbSet<TEntity> Table { get { return Context.Set<TEntity>(); } }

public virtual DbSet<TEntity> Table => Context.Set<TEntity>();

public virtual DbTransaction Transaction
{
get
{
return (DbTransaction)TransactionProvider?.GetActiveTransaction(new ActiveTransactionProviderArgs
{
{"ContextType", typeof(TDbContext) },
{"MultiTenancySide", MultiTenancySide }
});
}
}

public virtual DbConnection Connection
{
get
{
var connection = Context.Database.Connection;

if (connection.State != ConnectionState.Open)
{
connection.Open();
}

return connection;
}
}

private readonly IDbContextProvider<TDbContext> _dbContextProvider;

public IActiveTransactionProvider TransactionProvider { private get; set; }

/// <summary>
/// Constructor
/// </summary>
Expand Down
Loading

0 comments on commit 7ffc97c

Please sign in to comment.