2

次の問題があります。私のコードコンテキスト+モデル:

public class MediaPlanContext : DbContext
{
    public MediaPlanContext() : base(lazyLoading:false) {}

    public DbSet<MediaPlan> MediaPlan { get; set; }
    public DbSet<MovieType> MovieType { get; set; }
    public DbSet<MediaPlanItem> MediaPlanItems { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder
            .Entity<MediaPlanItem>()
            .HasKey(mpi => new {mpi.Id, mpi.MediaPlanId});
        modelBuilder
            .Entity<MediaPlanItem>()
            .Property(mpi => mpi.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        modelBuilder
            .Entity<MediaPlan>()
            .HasMany(mp => mp.MediaPlanItems)
            .WithRequired()
            .HasForeignKey(mpi => mpi.MediaPlanId)
            .WillCascadeOnDelete();
    }        
}

public class MediaPlan : IBaseObject
{
    public virtual ICollection<MediaPlanItem> MediaPlanItems { get; set; }
}

public class MediaPlanItem : IBaseObject
{
    public int MediaPlanId {get;set;}
    public MediaPlan MediaPlan {get;set;} 
}

public interface IBaseObject
{
    public int Id {get;}
    public DateTime DateCreated {get;}
    public DateTime DateModified {get;set;}
}

また、リポジトリを使用してIBaseObject-s、ルート オブジェクト MediaPlan でオブジェクト ( ) を処理します。DB 内のオブジェクトが削除されると、エンティティ (レコード) をマークIsDeleted = 1し、リポジトリ クラスに通常の削除を更新として処理するロジックがあり、代わりに に変更EntityStateします。ModifiedDeleted

次のコードの問題:

var rep = new MediaPlanRepository(new MediaPlanContext());
var withItems = rep.GetWithMediaPlanItems();
var m1 = withItems.First();
var mpi1 = m1.MediaPlanItems.First();
m1.MediaPlanItems.Remove(mpi1); // 6 items before remove
// 5 items after remove
rep.SaveChanges();
// 6 items after save changes :(

質問: saveChanges が発生した直後に処理してIsDeleted = 1エンティティを切り離すことはできますか? 私の問題は解決していますか?

備考:プロジェクションとしてルート オブジェクトにロードされた関連エンティティと、ジュリーが段落「これが期待どおりに機能しない場合のシナリオ」で述べているように、コンテキストによって既に追跡されているエンティティで問題が発生する可能性があります。

4

1 に答える 1

0

コード:

public override int SaveChanges()
{
    var result = base.SaveChanges();
    // AfterSave code
    var isDeletedEntities = EfContext.ChangeTracker
        .Entries()  
        .Select(dbE => new {  
             DBEntity = dbE,  
             BaseObject = (dbE.Entity as IBaseObject)})  
        .Where(dbe => dbe.BaseObject.IsDeleted);  

    foreach (var isDeletedEntity in isDeletedEntities)  
    {  
        isDeletedEntity.DBEntity.State = EntityState.Detached;  
    }
}
于 2012-11-04T08:42:38.423 に答える