【问题标题】:How to update EntityFramework Core Code First object including all properties which are also complex objects?如何更新 EntityFramework Core Code First 对象,包括所有也是复杂对象的属性?
【发布时间】:2017-05-10 18:10:02
【问题描述】:

我有一个类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 是一个包含多个属性的对象,这些属性都是SavingThrows。

我知道在我的控制器中,我已经尝试过

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

character 是从客户端发送的,但这不会更新数据库中的任何内容。我也尝试过_context.Characters.Attach(character),但这似乎也没有更新任何东西。我在这里做错了什么?

【问题讨论】:

  • “但这不起作用”可以在edit中使用一些详细说明
  • 对不起,我把它编辑得更清楚了
  • 仅仅因为你改变了一个变量指向dbchar = character;的对象并不意味着上下文有任何线索你在做什么。您需要更新存储库中的实例。我不是 100% 确定应该如何完成,但可以肯定的是,如果您将 dbchar 的每个属性(和子对象属性)设置为 character THEN SaveChanges 中的相应值(或者无论如何应该更新工作——也许附加然后保存更改?我不知道)应该工作......

标签: c# entity-framework entity-framework-core


【解决方案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。

正确的做法是将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 v. 1.1.2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多