C# 更新实体框架7中的继承实体
我有以下C# 更新实体框架7中的继承实体,c#,asp.net,entity-framework,entity-framework-core,C#,Asp.net,Entity Framework,Entity Framework Core,我有以下BaseballDbContext类: public class BaseballDbContext : DbContext { public DbSet<BaseballTeam> teams { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Hitter>();
BaseballDbContext
类:
public class BaseballDbContext : DbContext
{
public DbSet<BaseballTeam> teams { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Hitter>();
modelBuilder.Entity<Pitcher>();
}
}
运行代码后,只有玩家的名称得到更新,但没有homeruns属性:
如何同时更新子类和父类的属性?来自此答案,但这是一个解决方法: 不要使用AsNoTracking()跟踪更改。
使用(var context=new BaseballDbContext())
{
var team=context.teams.Include(q=>q.players.AsNoTracking().FirstOrDefault();
var hitter=team.players.OfType().FirstOrDefault();
hitter.name=“Donaldson”;
击球手本垒打=999;
背景更新(团队);
SaveChanges();
}
我想你应该看一看,可能会有一期新的你不也需要一个
DbSet
吗?看,不,我不需要它。这是一个抽象类。这可能值得一试:\u ctx.Entry(team.State=EntityState.Modified
将其放在更新调用之前。尝试过,但不幸的是它没有解决问题。据我所知,问题已经解决,将在下一个版本中提供。确定。。。这就是为什么你可能要打开一个问题。。。我认为,因为您没有跟踪更改,所以当您执行更新时,上下文会验证每个对象上的每个属性,但实际上并不确定
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; }
}
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();
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();
}