ユーザとそのすべての制約を他のテーブルで削除する方法が必要です。私は、SQL Serverでカスケード削除の知っているが、私はいくつかの理由でこれを使用することはできません。再帰的メソッドを使用したカスケード削除
ユーザーに複数の注文があり、それぞれの注文に商品がいくつかあるとします。私はメソッドのユーザーを送信するので、それは注文を見つけるforeachループでは、そのような順序で行くなど。
私はこれを再帰的に行う方法を書いています。それは物体を受け取り、すべての関係を見つけてそれをすべて通過しなければならない。
私はEFパワーツールをリバースエンジニアのコードを使ってデータベースから生成しています。
public partial class myDbContext: DbContext
{
...
public DbSet<Users> Users{ get; set; }
public DbSet<Orders> Orders{ get; set; }
public DbSet<Products> Products{ get; set; }
public DbSet<OrderProducts> OrderProducts{ get; set; }
...
}
public partial class Users
{
public int UserID { get; set; }
public string Username { get; set; }
public virtual ICollection<Orders> Orders{ get; set; }
}
public partial class Orders
{
public int OrderID { get; set; }
public virtual Users users { get; set; }
public virtual ICollection<OrderProducts> OPs { get; set; }
}
public partial class OrderProducts
{
public int OPID { get; set; }
public virtual Orders orders { get; set; }
public virtual Product products { get; set; }
}
私はユーザーオブジェクト内のすべてのvirtual ICollection
のを見つけることができています。このメソッドを使用して:ここに私のクラスです。私はそれがOrders
であることがわかりcollectionType[0]
を使用して
private void DeleteObjectAndChildren(object parent)
{
using (var ctx = new myDbContext())
{
Type t = parent.GetType();
//these are all virtual properties of parent
var properties = parent.GetType().GetProperties().Where(p => p.GetGetMethod().IsVirtual);
foreach (var p in properties)
{
var collectionType = p.PropertyType.GetGenericArguments();
//collectionType[0] gives me the T type in ICollection<T>
//what to do next?
}
}
}
、私が照会できるようにするには、このような何かを持っている必要があります。
var childType = ctx.Set<collectionType[0]>;
を私は右のキャストと全てを取得することはできません。
これが完全に間違っていれば、私は正しい方向に私を得るためにどんなヒントもありがとうと思います。
のようにそれを使用し、私はそれに付属するすべてのテストユーザーと物事を削除する必要があります。それは毎日のユースケースで公開され、使用されることを意図していません。また、関係やテーブルがたくさんあり、データベース側でこれを行う方法は考えられません。 –