中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

LindDotNetCore~ISoftDelete軟刪(shan)除接(jie)口

回到目錄

概念

ISoftDelete即軟刪除,數據(ju)在(zai)(zai)(zai)進行delete后不會從數據(ju)庫清除,而只是標記一個狀(zhuang)態,在(zai)(zai)(zai)業務范圍里都不能(neng)獲取到這(zhe)(zhe)個數據(ju),這(zhe)(zhe)在(zai)(zai)(zai)ORM框架里還是比較容易實現的,對傳統的ado來說需要對sql統一進行攔截和(he)條件過濾.

實施步驟

  1. 實體繼承ISoftDelete
  2. 數據上下文實現對IsDeleted的過濾
  3. 對刪除方法進行調整,添加對ISoftDelete的支持

代碼實現

1 實體(ti)繼(ji)承ISoftDelete

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    {
        // 1. Add the IsDeleted property
        entityType.GetOrAddProperty("IsDeleted", typeof(bool));

        // 2. Create the query filter
        var parameter = Expression.Parameter(entityType.ClrType);

        // 3. EF.Property<bool>(post, "IsDeleted")
        var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool));
        var isDeletedProperty = Expression.Call(propertyMethodInfo, parameter, Expression.Constant("IsDeleted"));

        // 4. EF.Property&lt;bool>(post, "IsDeleted") == false
        BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeletedProperty, Expression.Constant(false));

        // 5. post => EF.Property<bool>(post, "IsDeleted") == false
        var lambda = Expression.Lambda(compareExpression, parameter);

        modelBuilder.Entity(entityType.ClrType).HasQueryFilter(lambda);

2 數據上下文實現對IsDeleted的過濾

public class ProductInfo : EntityBase, ISoftDelete
{
    public string Title { get; set; }
    public decimal Amount { get; set; }
    public int Discount { get; set; }
    public int Inventory { get; set; }
    public DateTime DeletedDate { get; set; }
    public string DeletedUser { get; set; }
    public bool IsDeleted { get; set; }

    /// <summary>
    /// domain method
    /// </summary>
    /// <returns></returns>
    public decimal GetSaleAmount()
    {
        return Amount * Discount / 100;
    }
}

3 對刪除方法進行調整,添加對ISoftDelete的支持

代碼(ma)來自Lind.DotNetCore.Repository.EFRepository類(lei)型

public void Delete(TEntity item)
{
    if (item != null)
    {
        if (typeof(ISoftDelete).IsAssignableFrom(item.GetType()))
        {
            Db.Entry(item).State = EntityState.Modified;
            var delEntity = item as ISoftDelete;
            delEntity.DeletedDate = DateTime.Now;
            delEntity.IsDeleted = true;
        }
        else
        {
            //物理刪(shan)除
            Db.Set<TEntity>().Attach(item as TEntity);
            Db.Entry(item).State = EntityState.Deleted;
            Db.Set<TEntity>().Remove(item as TEntity);
        }
        this.SaveChanges();
    }
}

上(shang)(shang)面(mian)幾(ji)行代碼(ma)實現了對軟刪(shan)除的完整支持,從ISoftDelete接口到(dao)數(shu)據(ju)上(shang)(shang)下(xia)文里的過濾IsDeleted,再到(dao)優化(hua)后(hou)的Delete()方法,一切看上(shang)(shang)去都很優雅!

對于軟刪(shan)除支持的框架也很多(duo),像abp,eshopconationer,linddotnetcore等!

歡(huan)迎(ying)大家的閱讀(du)與思考(kao)!

 回到目錄

posted @ 2018-02-28 14:52  張占嶺  閱讀(1309)  評論(0)    收藏  舉報