2017-05-10 12 views
0

私はクラスがCharacterであり、そのプロパティはプリミティブと複合オブジェクトの組み合わせであり、それらのオブジェクトのいくつかは複雑なオブジェクトでもあるプロパティを持っています。これらのすべては、EFCoreコードファーストを通じて生成された独自のテーブルを各クラスに持つデータベースで表されます。ここでEntityFrameworkコアコードを更新する方法複合オブジェクトでもあるすべてのプロパティを含む最初のオブジェクト?

は私が達成しようとしているかの小さな例です:

public class Character 
{ 
[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int Id { get; set; } 
public string Name { get; set; } 
public string Race { get; set; } 
public DeathSaves DeathSaves{ get; set; } 
public SavingThrows SavingThrows { get; set; } 
} 


public class DeathSaves 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public bool? Success1 { get; set; } 
    public bool? Success2 { get; set; } 
    public bool? Success3 { get; set; } 
    public bool? Failure1 { get; set; } 
    public bool? Failure2 { get; set; } 
    public bool? Failure3 { get; set; } 
} 

public class SavingThrows 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public SavingThrow Strength { get; set; } 
    public SavingThrow Dexterity { get; set; } 
    public SavingThrow Constitution { get; set; } 
    public SavingThrow Intelligence { get; set; } 
    public SavingThrow Wisdom { get; set; } 
    public SavingThrow Charisma { get; set; } 
} 

public class SavingThrow 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public bool? Proficient { get; set; } 
    public int? Value { get; set; } 
} 

を使用すると、上記の見ることができるように、私のCharacterクラスは、プリミティブの対象であるDeathSavesが含まれており、複数を含むオブジェクトですSavingThrowsプロパティはすべてSavingThrowです。

私は私のコントローラで、私はcharacterがクライアントから送信されたが、それはDBに何かを更新しません

var dbchar = _context.Characters.SingleOrDefault(x => x.Id == character.id); 
dbchar = character; 
_context.SaveChanges(); 

を試みたことを知っています。私も_context.Characters.Attach(character)をやってみましたが、それは何も更新していないようです。私はここで間違って何をしていますか?

+0

"しかしそれはうまくいかない" [編集] – Will

+1

で精巧に使うことができる申し訳ありませんが、私はそれをもっと明確に編集しました –

+0

オブジェクトを変更するだけで、変数が 'dbchar = character; 'を指していても、あなたがやっていることのコンテキストがコンテキストにあるとは限りません。レポ内のインスタンスの更新を行う必要があります。私は100%確実に行うべきではありませんが、 'dbchar'のすべてのプロパティ(および子オブジェクトのプロパティ)を' character'のそれぞれの値に設定した場合、THEN 'SaveChanges'(またはUpdateが想定されています)仕事をする - 多分変更を保存するか?私は分からない)うまくいくはず... – Will

答えて

1

コードのこの作品...

var dbchar = _context.Characters.SingleOrDefault(x => x.Id == character.id); 
dbchar = character; 

...は、いくつかの追跡されていないオブジェクトを参照することにより、コンテキストのキャッシュ内の文字オブジェクトへの参照を置き換えます。その瞬間、あなたは追跡対象のハンドルを失いました。

var dbchar = new Character { Name = "John" }; // character1 
dbchar = new Character { Name = "Pete" }; // character2 

オブジェクトcharacter1は範囲外ですが、それでもJohnです。

これを行うための正しい方法はdbcharcharacterの値をコピーするかのいずれかである:

var dbchar = _context.Characters.Find(character.id); 
db.Entry(cbchar).CurrentValues.SetValues(character); 

またはコンテキストにcharacterを添付して、修正され、それをマークする:

db.Attach(character); 
db.Entry(character).State = EntityState.Modified; 

(使用されますef-core v。1.1.2)

関連する問題