3

これが私が達成しようとしていることです:

一部のエンティティは "論理的に削除" する必要があるため、"IsDeleted" というフィールド (およびそれぞれの列) を追加したいと思います。このプロパティは、DAL からのみアクセスできるようにしたいと考えています (これは、フレンド アセンブリを介して実現できます)。また、インターフェイス (IDeletable) を介して、DAL がこれらすべてのエンティティを同じように処理できるようになれば幸いです。

両方の目標を達成するために、IDeletable を内部インターフェイスにし、このインターフェイスを実装するクラスで明示的なインターフェイスを利用できます。

bool IDeletable.IsDeleted { get; set; }

DAL コードは、おそらく次のようになります。

public void Delete<T>(T entity)
{
    var d = entity as IDeletable;
    if(d != null)
       //soft delete
       d.IsDeleted = true;
    else
       //hard delete

    //....
 }

問題は、私が知る限り、EF Code First には列を生成する方法がないことです。式を使用してみましたが、IDeletable にキャストしようとするとエラーが発生します。

式なしで EF Code First に強制的に列を作成させる方法はありますか?

4

2 に答える 2

-1

EFが式なしで列を作成しないという意味がよくわかりませんが、達成しようとしているものの実際の例を次に示します。

class Program
    {
        static void Main(string[] args)
        {
            using (var ctx = new MyContext())
            {
                var a = new A { IsDeleted = false };
                var b = new B { };
                ctx.As.Add(a);
                ctx.Bs.Add(b);
                ctx.SaveChanges();

                ctx.Delete(a);
                ctx.Delete(b);
            }
            // At this point A is soft deleted and B is permanantly deleted
            Console.ReadLine();
        }
    }



    public class MyContext : DbContext
    {
        public DbSet<A> As { get; set; }
        public DbSet<B> Bs { get; set; }

        public void Delete<T>(T entity) where T:class
        {
            var d = entity as IDeletable;
            if (d != null)
            {
                //soft delete
                d.IsDeleted = true;
            }
            else
            {
                //Use ugly delete as we dont know the dbset this applies to
                this.Entry(entity).State = System.Data.EntityState.Deleted;
            }
            this.SaveChanges();
        }
    }

    public interface IDeletable
    {
        bool IsDeleted { get; set; }
    }

    public class A : IDeletable
    {
        public int Id { get; set; }
        //Implementing this interface adds a column to this entity (no issues here?)
        public bool IsDeleted { get; set; }
    }

    public class B
    {
        public int Id { get; set; }
    }
于 2013-03-08T22:39:18.000 に答える