2016-06-17 11 views
0

データベース内の2つのオブジェクトを同時に更新しようとしています。私の現在のコードでは、それは私のナビゲーションプロパティを更新するようだ。たとえば、最初のクラスの「スコア」が変更された場合、更新されません。しかし、第二クラスの何かが変更されれば、それは適切に更新されます。私はここで何が間違っているのか分かりません。これはコードファーストのエンティティフレームワークです。エンティティフレームワークのナビゲーションプロパティをどのように更新しますか?

私は2つのクラスがあります:私は削除した場合

var entry = context.Entry(sampleFormClass); 
    entry.State = System.Data.Entity.EntityState.Modified; 
    entry.Property(e => e.Items).IsModified = false; 

    foreach (var navigationProperty in myTestClass.Test) 
    { 
      var entityEntry = context.Entry(navigationProperty); 
      entityEntry.State = System.Data.Entity.EntityState.Modified; 
      entityEntry.Property(navProp => navProp.SampleClassId).IsModified = false; 
    } 

    context.FormData.Attach(sampleFormClass); 
    } 
    context.SaveChanges(); 

:私はこれを持っているデータベースに更新するには

public class Test 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int TestId { get; set; } 
    public double RawScore { get; set; } 
    public double PercentScore { get; set; } 

    public int SampleClassId { get; set; } 

    [ForeignKey("SampleClassId")] 
    public virtual SampleClass SampleClass { get; set; } 
} 

public class SampleClass 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public int TestId { get; set; } 
    public string Items { get; set; } 
    public int Score { get; set; } 

    public IList<Test> Test { get; set; } 
} 

そして、このようになります別のクラスを私のメソッドでforeachオブジェクトを更新すると、navプロパティが更新されません。オブジェクトとそのオブジェクトのリストの両方を同時に更新するにはどうすればよいですか?編集

私の問題へ

ソリューション:私はこれに私の更新方法でコードを再配置することによって自分自身の問題を解決することができました:

context.FormData.Attach(sampleFormClass); 

    var entry = context.Entry(sampleFormClass); 
    entry.State = System.Data.Entity.EntityState.Modified; 
    entry.Property(e => e.Items).IsModified = false; 

    foreach (var navigationProperty in myTestClass.Test) 
    { 
      var entityEntry = context.Entry(navigationProperty); 
      entityEntry.State = System.Data.Entity.EntityState.Modified; 
      entityEntry.Property(navProp => navProp.SampleClassId).IsModified = false; 
    } 


    } 
    context.SaveChanges(); 

私はどこのラインを移動更新するオブジェクトを他のものよりも上に置きます。

+1

人が手動でエンティティの状態を変更している理由について私は理解していません。人々が追随し続ける本当に悪いチュートリアルがあるはずです。変更したいプロパティを変更して 'SaveChanges'を呼び出すだけで、EFは残りのものを処理します。 「Entity Framework 6を​​使用してレコードを更新する方法」の可能な複製?(http://stackoverflow.com/questions/25894587/how-to-update-record-using-entity-framework-6) –

+1

@CraigW。多くの場合、これによりデータベースへのラウンドトリップが防止されるためです。それは正当化されるかもしれないし、そうでないかもしれない、[それは依存する](http://stackoverflow.com/q/7106211/861716)。 –

答えて

0

私はこれに私の更新方法でコードを再配置することによって自分自身の問題を解決することができました:

context.FormData.Attach(sampleFormClass); 

var entry = context.Entry(sampleFormClass); 
entry.State = System.Data.Entity.EntityState.Modified; 
entry.Property(e => e.Items).IsModified = false; 

foreach (var navigationProperty in myTestClass.Test) 
{ 
     var entityEntry = context.Entry(navigationProperty); 
     entityEntry.State = System.Data.Entity.EntityState.Modified; 
     entityEntry.Property(navProp => navProp.SampleClassId).IsModified = false; 
} 


} 
context.SaveChanges(); 

私はちょうどあなたが他のすべての上に更新しようとしているオブジェクトを添付している行を移動しました。

関連する問題