Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更新实体框架7中的继承实体_C#_Asp.net_Entity Framework_Entity Framework Core - Fatal编程技术网

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();
}