0

最初にエンティティ フレームワークとコードを使用するプロジェクトに取り組んでいます。これが私の短縮クラスです

public class BenefitsForm : IAnnualForm, IAuditable 
{
    public BenefitsUser UserInfo { get; set; }
    public CoverageLevel Medical { get; set; }
}

public class MedicalPlan : IHealthPlan
{
    public int Id { get; set; }
    public virtual IList<CoverageLevel> CoverageLevels { get; set; }
}

public class CoverageLevel
{
    public int Id { get; set; }
    public virtual MedicalPlan MedicalPlan { get; set; }
}

各 MedicalPlan には 4 つの補償レベルがあります。私はすでに自分の補償レベルと医療計画をデータベースに作成しています。ただし、BenefitsForm を作成すると、クラスのエントリが重複して作成されます (既にデータベースに存在します)。これを防ぐにはどうすればよいですか?これがどのように発生するかを示す小さなコード スニペットを次に示します。

BenefitsForm form = new BenefitsForm() { UserInfo = new BenefitsUser() };
using(var repo = new CoverageLevelRepository())
{
    form.Medical = repo.Retrieve(new NumericKey(formId))); //this retrieves the coveragelevel with the id I want.
}
formRepository.Create(form); // this creates a duplicate med plan and 4 duplicate coverage levels.
formRepository.SaveChanges();
4

3 に答える 3

2

保存しているコンテキストとは異なるコンテキストから Medical フィールドを取得しているためだと思います-- repovs. formRepository; formRepositoryによって作成されたオブジェクトを追跡していないrepoため、新しいオブジェクトであると想定し、重複したエントリを作成します。パフォーマンス上の理由から、Entity Framework が存在チェックを挿入するとは思えません。追跡は、オブジェクト コンテキスト自体によって内部的に処理されます。各オブジェクトは、単一のオブジェクト コンテキストにバインドされます。同じリポジトリを使用して を取得しMedicalPlan、新しい を書き戻してみてくださいBenefitsForm。重複はありません。

BenefitsForm form = new BenefitsForm() { UserInfo = new BenefitsUser() }; 
using(var repo = new Repository()) 
{ 
  form.Medical = repo.Retrieve(new NumericKey(formId))); //this retrieves the coveragelevel with the id I want. 
  repo.Create(form); // this creates a duplicate med plan and 4 duplicate coverage levels. 
  repo.SaveChanges(); 
} 
于 2012-07-31T18:16:24.373 に答える
0

formRepository.SaveChanges() の代わりに、SaveOptions Enum で SaveChanges を使用してみてください。

例:

ObjectContext.SaveChanges(
           System.Data.Objects.SaveOptions.DetectChangesBeforeSave
                   );

詳細については、リンクを参照してくださいhttp://msdn.microsoft.com/en-us/library/dd395500.aspx

于 2012-07-31T16:52:13.440 に答える
0

IList<...>1 対多の関連付けに代わりに使用ICollection<...>すると、誤動作が発生する可能性があります。それを変えてみてください。それ以外は、CoverageLevelRepositoryあなたが投稿していないコードの可能性があります。関連付けの詳細については、このガイドを参照してください

于 2012-07-31T16:55:20.923 に答える