Entity Framework 4.2 Code Firstの自己関連テーブルに対する操作方法
5781 ワード
最近ASPを勉強して使っています.NET MVC 3+Entity Framework 4.2というプロジェクトは、以前EFのCode Firstにあまり詳しくなかったため、使用中に多くのトラブルに遭遇しましたが、その中で最初に頭が痛いことは自己関連表(木の構造を実現するため)の操作で、幸いにも最後に解決しました.
まず、エンティティオブジェクトDemoEntityは次のとおりです.
次にDbContext:
さて、これから一番お父さんのことが来ます.私の苦労を経て、EF自身のカスケード削除機能が任意の実体オブジェクトとその子オブジェクトを簡単に削除できることを期待していましたが、EFは最初の階層の子データを削除するしかありませんでした.もっと多くの階層が間違っています.EFとSQL Serverは自己関連テーブルのカスケード削除に対して同じであることを発見した:操作できないので、愚かな方法を採用するしかなく、すべてのサブデータを再帰して削除を反転する:
みんなが更に良い方法があることを知らないで、私の技术が深くないため、十分にその中の原理を确定することができなくて、同じく高い人が教えることができることを望みます!
まず、エンティティオブジェクトDemoEntityは次のとおりです.
public class DemoEntity
{
public DemoEntity()
{
this.ChildEntitis = new HashSet<DemoEntity>(); //
}
[Key] //
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] //
public int Id { get; set; }
// Id,int? ? , 。
public int? ParentId { get; set; }
public string Name { get; set; }
// ,virtual 。
public virtual DemoEntity ParentEntity { get; set; }
// ,virtual 。
[ForeignKey("ParentId")] //
public virtual ICollection<DemoEntity> ChildEntitis { get; set; }
}
次にDbContext:
public class EFDbcontext : DbContext
{
public DbSet<DemoEntity> DemoEntitis { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// , ,
//modelBuilder.Entity<DemoEntity>()
// .HasOptional(e => e.ParentEntity)
// .WithMany(e => e.ChildEntitis)
// .WillCascadeOnDelete();
}
}
さて、これから一番お父さんのことが来ます.私の苦労を経て、EF自身のカスケード削除機能が任意の実体オブジェクトとその子オブジェクトを簡単に削除できることを期待していましたが、EFは最初の階層の子データを削除するしかありませんでした.もっと多くの階層が間違っています.EFとSQL Serverは自己関連テーブルのカスケード削除に対して同じであることを発見した:操作できないので、愚かな方法を採用するしかなく、すべてのサブデータを再帰して削除を反転する:
private EFDbcontext context = new EFDbcontext();
public void DeleteWbsElement(DemoEntity demoEntity)
{
List<DemoEntity> list = new List<DemoEntity>();
CreateDeleteList(demoEntity, list);
list.Reverse(); // List
list.ForEach(e => context.DemoEntitis.Remove(e)); //
context.SaveChanges();
}
// List
void CreateDeleteList(DemoEntity demoEntity, List<DemoEntity> list)
{
list.Add(demoEntity);
if (demoEntity.ChildEntitis.Count > 0)
{
foreach (DemoEntity element in DemoEntity.ChildEntitis)
{
CreateDeleteList(element, list);
}
}
}
みんなが更に良い方法があることを知らないで、私の技术が深くないため、十分にその中の原理を确定することができなくて、同じく高い人が教えることができることを望みます!