【问题标题】:Update inherited Entity in Entity Framework 7在 Entity Framework 7 中更新继承的实体
【发布时间】:2016-04-07 22:40:30
【问题描述】:

我有以下BaseballDbContext 类:

public class BaseballDbContext : DbContext
{
   public DbSet<BaseballTeam> teams { get; set; }

   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
       modelBuilder.Entity<Hitter>();
       modelBuilder.Entity<Pitcher>();
   }
}

我的模型类是:

public class BaseballTeam
{
    public int Id { get; set; }
    public string teamName { get; set; }
    public List<BaseballPlayer> players { get; set; }
}

public abstract class BaseballPlayer
{
    public int Id { get; set; }
    public int age { get; set; }
    public string name { get; set; }
}

public class Hitter : BaseballPlayer
{
    public int homeruns { get; set; }
}

public class Pitcher : BaseballPlayer
{
    public int strikeouts { get; set; }
}

最初在玩家表中播种数据:

现在我想更新其中一位击球手的name 和homeruns 属性:

BaseballTeam team = _ctx.teams.Include(q => q.players).FirstOrDefault();
Hitter hitter = team.players.OfType<Hitter>().FirstOrDefault();
hitter.name = "Tulowitzki";  //that property will be updated
hitter.homeruns = 399;       //but that will not :(

int i = team.players.FindIndex(q => q.Id == hitter.Id);
team.players[i] = hitter;

_ctx.Update(team);
_ctx.SaveChanges();

在我运行代码后,只有玩家的名字得到了更新,而不是 homeruns 属性:

如何更新子类和父类的属性?

【问题讨论】:

  • 你不需要DbSet&lt;BaseballPlayer&gt; 吗?见here
  • 不,我不需要它。它是一个抽象类。
  • 这可能值得一试:_ctx.Entry(team).State = EntityState.Modified 把它放在更新调用之前。
  • 试过了,可惜没有解决问题。
  • 据我了解,该问题已经修复,将在下一个版本中提供github.com/aspnet/EntityFramework/commit/…

标签: c# asp.net entity-framework entity-framework-core


【解决方案1】:

从这个答案,但这是一个解决方法:Save changes to child class properties using base class query with Entity Framework TPH patten:

不要使用 AsNoTracking() 跟踪更改

using (var context = new BaseballDbContext())
{
    var team = context.teams.Include(q => q.players).AsNoTracking().FirstOrDefault();
    var hitter = team.players.OfType<Hitter>().FirstOrDefault();
    hitter.name = "Donaldson";
    hitter.homeruns = 999;
    context.Update(team);
    context.SaveChanges();
}

我认为你应该看看opened issues related to inheritance 并且可能会打开一个新问题

【讨论】:

  • 当然...这就是为什么您可能必须打开一个问题...我认为因为您没有跟踪更改,所以当您执行更新时,上下文会验证每个对象上的每个属性,但实际上不确定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多