ABP领域层——实体
参考阳光铭睿的教程:http://www.cnblogs.com/mienreal/p/4528470.html
实体类
在ABP中,实体类继承自Entity类
public class Person : Entity { public virtual string Name { get; set; } }
Person类的父类中有Id属性,Id是该实体的主键,默认类型是int,如果想给Id定义其他类型,如下,也可以设置为string,Guid
public class Person : Entity<long> { public virtual string Name { get; set; } }
实体类重写了==操作符,还定义了一个IsTransient()方法来检测实体是否有Id属性
Person.Person p1 = new Person.Person { Id = 1, Name = "mm" }; Person.Person p2 = new Person.Person { Id = 1, Name = "jj" }; bool flag = p1 == p2;//true
部分源码
public override bool Equals(object obj) { if (obj == null || !(obj is Entity<TPrimaryKey>)) { return false; } //Same instances must be considered as equal if (ReferenceEquals(this, obj)) { return true; } //Transient objects are not considered as equal var other = (Entity<TPrimaryKey>)obj; if (IsTransient() && other.IsTransient()) { return false; } //Must have a IS-A relation of types or must be same type var typeOfThis = GetType(); var typeOfOther = other.GetType(); if (!typeOfThis.IsAssignableFrom(typeOfOther) && !typeOfOther.IsAssignableFrom(typeOfThis)) { return false; } if (this is IMayHaveTenant && other is IMayHaveTenant && this.As<IMayHaveTenant>().TenantId != other.As<IMayHaveTenant>().TenantId) { return false; } if (this is IMustHaveTenant && other is IMustHaveTenant && this.As<IMustHaveTenant>().TenantId != other.As<IMustHaveTenant>().TenantId) { return false; } return Id.Equals(other.Id); }
接口约定
实体类实现IHasCreationTime接口就可以具有CreationTime属性,插入数据库时自动设置为当前时。
ICreationAudited 扩展自 IHasCreationTime 并且该接口具有属性CreatorUserId,当保存一个新的实体时,
ABP会自动设 CreatorUserId的属性值为当前用户的Id。可以直接派生自实体类CreationAuditedEntity。
更新实现接口IModificationAudited 。实现添加和更新属性,扩展IAudited接口,或直接派生自AuditedEntity 。
软删除实现该接口ISoftDelete ,记录谁删了这个实体,实现接口IDeletionAudited 。
扩展所有审计接口,实现IFullAudited ,或直接派生自FullAuditedEntity
public class Person : Entity, IFullAudited { public DateTime CreationTime { get; set; } public long? CreatorUserId { get; set; } public DateTime? DeletionTime { get; set; } public long? DeleterUserId { get; set; } public bool IsDeleted { get; set; } public DateTime? LastModificationTime { get; set; } public long? LastModifierUserId{ get; set; } }
部分源码
public override int SaveChanges() { try { ApplyAbpConcepts(); return base.SaveChanges(); } catch (DbEntityValidationException ex) { LogDbEntityValidationException(ex); throw; } } protected virtual void ApplyAbpConcepts() { var userId = GetAuditUserId(); var entries = ChangeTracker.Entries().ToList(); foreach (var entry in entries) { switch (entry.State) { case EntityState.Added: CheckAndSetId(entry.Entity); CheckAndSetMustHaveTenantIdProperty(entry.Entity); CheckAndSetMayHaveTenantIdProperty(entry.Entity); SetCreationAuditProperties(entry.Entity, userId); EntityChangeEventHelper.TriggerEntityCreatingEvent(entry.Entity); EntityChangeEventHelper.TriggerEntityCreatedEventOnUowCompleted(entry.Entity); break; case EntityState.Modified: SetModificationAuditProperties(entry, userId); if (entry.Entity is ISoftDelete && entry.Entity.As<ISoftDelete>().IsDeleted) { SetDeletionAuditProperties(entry.Entity, userId); EntityChangeEventHelper.TriggerEntityDeletingEvent(entry.Entity); EntityChangeEventHelper.TriggerEntityDeletedEventOnUowCompleted(entry.Entity); } else { EntityChangeEventHelper.TriggerEntityUpdatingEvent(entry.Entity); EntityChangeEventHelper.TriggerEntityUpdatedEventOnUowCompleted(entry.Entity); } break; case EntityState.Deleted: CancelDeletionForSoftDelete(entry); SetDeletionAuditProperties(entry.Entity, userId); EntityChangeEventHelper.TriggerEntityDeletingEvent(entry.Entity); EntityChangeEventHelper.TriggerEntityDeletedEventOnUowCompleted(entry.Entity); break; } TriggerDomainEvents(entry.Entity); } }

浙公网安备 33010602011771号