簡體   English   中英

如何更新EntityFramework Core Code First對象,包括所有也是復雜對象的屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM