2017-12-24 7 views
1

をコレクションメンバーを無視:私はクラスのように定義されているEFコアに

public class Subject 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; 

    [ForeignKey("LevelId")] 
    public Level Level { get; set; } 

    [ForeignKey("ParentId")] 
    public Subject Parent { get; set; } 

    public ICollection<Subject> Children { get; set; } 
} 

そして作成する方法:

public int Create(Subject newSubject) 
{ 
    var subjectToAdd = _mapper.Map<dataModels.Subject>(newSubject); 
    _context.Add(subjectToAdd); 

    SaveChildren(subjectToAdd.Id, newSubject.LevelId, newSubject.Children); 

    _context.SaveChanges(); 

    return subjectToAdd.Id; 
} 

私の問題は、子供たちは二度、一度では、保存されているということです。

_context.Add(subjectToAdd); 

ためのマッピング時に、子供たちは

で再び、その後マッピングされ、
SaveChildren(); 

私が達成したいのは、EFがChildrenコレクション内の変更を無視し、SaveChildren()で手動で変更を保存することです。

は、私はこれを追加してみました:

var subjectToAdd = _mapper.Map<dataModels.Subject>(newSubject); 
_context.Add(subjectToAdd); 
_context.Entry(user).Property(x => x.Children).IsModified = false; // this line 

が、それはうまくいきませんでした。また、それをnullにしようとしましたが、それは切断されたエラーに関する何かを言った。そのプロパティを削除せずにEFでChildrenコレクションを無視させるにはどうしたらよいですか?

+0

なぜ 'SaveChildren'コールを削除しないのですか?一般に、1つのビジネストランザクションに複数のコンテキストを含めることは避けるべきです。理想的には、1つのデータベーストランザクションで1つのビジネストランザクションを処理し、1つの 'SaveChanges'コールで結論づける必要があります。 –

答えて

0

SaveChangesが適用された場合、の入力状態を変更して、挿入しないようにすることができます。

子供を手動で挿入する前に、Subjectを保存してください。 newSubject.Idを生成する必要があります。

また、newSubjectがマップされているため、不要です。ですから、Createメソッドをこのように変更しました。

public int Create(Subject newSubject) 
{ 
    // The newSubject entry state has been changed as 'Added' 
    _context.Subjects.Add(newSubject); 

    // The children of newSubject entry state has been changed as 'Unchanged' and children will not be inserted 
    _context.Entry(newSubject.Children).State = EntityState.Unchanged; 

    //Save the newSubject entity 
    _context.SaveChanges(); 

    //Save the children 
    SaveChildren(newSubject.Id, newSubject.LevelId, newSubject.Children); 

    return newSubject.Id; 
} 
関連する問題