![](/img/trans.png)
[英]How update object with relation data in EntityFramework Core
[英]How to update EntityFramework Core Code First object including all properties which are also complex objects?
我有一個Character
類,其屬性是基元和復雜對象的混合,其中一些對象的屬性也是復雜對象。 所有這些都在數據庫中表示,每個類都有自己的表,這些表是通過EFCore Code First生成的。
這是我要完成的工作的一個較小示例:
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
。
我知道在控制器中,我已經嘗試過
var dbchar = _context.Characters.SingleOrDefault(x => x.Id == character.id);
dbchar = character;
_context.SaveChanges();
從客戶端發送character
位置,但不會更新數據庫中的任何內容。 我也嘗試過做_context.Characters.Attach(character)
,這似乎也沒有更新任何東西。 我在這里做錯了什么?
這段代碼...
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。
正確的方法是將character
的值復制到dbchar
:
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 1.1.2版)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.