2017-06-18 5 views
1

を数えます。一般的な方法は、現在、私はこのコードを使用していますエンティティフレームワークで

public bool Delete(int companyId, int opportunityId) 
{ 
    var opportunity = _opportunityRepository.FindOne(companyId: companyId, opportunityId: opportunityId).FirstOrDefault(); 

    if (!opportunity.Contacts.Where(x => x.IsDeleted = false).IsNullOrEmpty()) 
    { 
     throw new UserFriendlyException(ErrorMessages.UserFriendly.UnableToDeleteEntityHasRelatedData); 
    } 

    opportunity.IsDeleted = true; 
    _opportunityRepository.Edit(opportunity); 
    CurrentUnitOfWork.Commit(); 

    return true; 
} 

この方法は、繰り返し実行され、何百もの場所を配置するのに時間がかかります。

エンティティタイプをチェックし、リフレクションや別の方法を使用してICollection<T>を実装したすべてのプロパティをチェックし、クエリを実行してカウントを確認できる汎用ファンクションにするにはどうすればよいですか?

[ForeignKey("DepartmentId")] 
public virtual ICollection<DepartmentLocation> DepartmentLocations { get; set; } 
[ForeignKey("DepartmentId")] 
public virtual ICollection<EmployeePosition> EmployeePositions { get; set; } 
+1

関係でカスケード削除を有効にしないのはなぜですか? – haim770

+0

カスケードを使用したくない場合は無効にしてください...削除時のカスケードのデフォルトは、必要なリレーションまたはオプションのリレーションに依存します... – grek40

答えて

0

このようなチェックを行うためにリフレクションでコレクションを解決してもらいたい場合でも、私はお勧めしません。あなたが見ている問題のドメインは、基本的に「私の子供のすべてが最初に削除済みとしてマークされている場合にのみ、私は削除済みとしてマークすることができます」というソフト削除の周りにビジネスロジックを適用したいと思うように見えます。あなたはすぐにリフレクションを介してこれをやろうとして直面する問題は、次のとおりです。遅延読み込みに

  • ヒットを削除するには、すべてのオブジェクトを検査する
  • コンプレックスと遅いコードを。

遅延読み込みの危険性とそれをエスケープしようとすると、ドラゴンズの最初の警告になります。私は、単一のドメインオブジェクトを返すのではなく、リポジトリからIQueryableを利用することを検討しています。そこからは、オブジェクトがアクティブな子を持つかどうかを判断するために、あなたのモデルにドリルダウンする柔軟性を持っている:

var activeState = _opportunityRepository.GetById(companyId, opportunityId) // return IQueryable<Opportunity> 
    .Select(o=> new {o.IsDeleted, HasActiveContact = o.Contacts.Any(c=> !c.IsDeleted)}) 
    .SingleOrDefault(); 

そこから、アノンのプロパティを確認することができます。タイプ。サーバーに送信されたクエリは、1回のヒットでパフォーマンス面で最適な状態を維持する必要があります。コードは、単純な拡張可能な構造であり、遅延ロードなどを気にすることなく簡単に展開できます。親を削除済みとしてマークする前に、子がまだアクティブであるというメッセージを拡張したい場合は、アクティブな子を返すようにそれを展開することができます。

関連する問題