1

データベースで論理的な削除を行いたいです。IsDeleted 値を true に設定して削除フラグを立てることで、データベースへの削除を処理します。それに応じて、Breeze クエリで IsDeleted フラグが設定された行を除外する必要があります。

クライアントではなくサーバー側でこれを行うことを好みます。

カスタム Breeze EFContextProvider で削除をインターセプトし、IsDeleted 属性を設定できます。entityInfo.EntityState = EntityState.Modified を設定して、更新を続行したいと思います。ただし、entityInfo.EntityState は読み取り専用のようです。

これを達成する他の方法はありますか?

4

4 に答える 4

1

Entity Framework を使用してこのサーバー サイドを実行する良い方法を見つけたのではないかと思います。

テーブル内の特定の行に対して IsDeleted を true に設定するストアド プロシージャを作成する必要があります。

次に、edmx ファイルで、エンティティの [マッピングの詳細] に移動し、[エンティティを関数にマップ] を選択します。をクリックして、SP を指定します。

最初にコードを使用している場合は、これが同じことを行うのに役立つかもしれません: https://msdn.microsoft.com/en-us/data/dn468673.aspx

于 2016-05-06T21:00:14.570 に答える
0

EntityAspect.setModifiedsetDeleted、およびsetUnchangedメソッドを使用して、これを実現できます。すなわち

myEntity.entityAspect.setModified();
于 2013-05-23T22:24:38.907 に答える
0

現在の動作方法の 1 つは、リフレクションを使用するためあまりエレガントではありませんが、解決策がないよりはましです。

「ExclusionDate」プロパティを使用して使用する非常に単純化された方法に従います。

// Model  -----------------------------------

public interface ISoftDelete
{
    DateTime? ExclusionDate { get; set; } 
}

public class Order : ISoftDelete
{
    // Props...
    public DateTime? ExclusionDate { get; set; }
}

// ------------------------------------------

// Data -------------------------------------

public interface IBreezeRepository<out T>
{
    IQueryable<T> All();
}

public class SoftRepository<T> : 
    IBreezeRepository<T> where T : class, ISoftDelete
{
    public SoftRepository(DbContext context)
    {
        Context = context;
    }

    protected DbContext Context { get; private set; }

    public IQueryable<T> All()
    {
        return Context.Set<T>().Where(p=> !p.ExclusionDate.HasValue);
    }
}

public class UnitOfWork
{
    private readonly EFContextProvider<EcmContext> _contextProvider;

    public UnitOfWork()
    {
        _contextProvider = new EFContextProvider<EcmContext>
        {
            BeforeSaveEntityDelegate = BeforeSaveEntity
        };

        var context = _contextProvider.Context;
        Orders = new SoftRepository<Order>(context);
    }

    public IBreezeRepository<Order> Orders { get; private set; }

    private bool BeforeSaveEntity(EntityInfo entityInfo)
    {
        var entityType = entityInfo.Entity.GetType();
        // a little reflection magic
        if (typeof(ISoftDelete).IsAssignableFrom(entityType) && 
            entityInfo.EntityState == EntityState.Deleted)
        {
            entityInfo.GetType().GetProperty("EntityState")
                      .SetValue(entityInfo, EntityState.Modified, null);
            var entity = entityInfo.Entity as ISoftDelete;
            if (entity != null)
            {
                entity.ExclusionDate = DateTime.Now;
                entityInfo.ForceUpdate = true;
            }
        }

        return true;
    }
}

// -------------------------------------------

参照: Breeze JS で論理削除を実行する方法

于 2014-03-28T21:27:39.153 に答える