2016-04-07 18 views
4

Ich habe folgende BaseballDbContext Klasse:aktualisiert geerbt Entity in Entity Framework 7

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

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

Und meine Modellklassen sind:

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

Anfänge ausgesät Daten in der Spieler-Tabelle:

enter image description here

Jetzt möchte ichaktualisierenund homeruns Eigenschaft eines der Hitter:

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

Nachdem ich den Code nur Spielernamen Update bekam laufen, aber nicht die Homeruns Eigenschaft:

enter image description here

So aktualisieren Eigenschaft sowohl Kind und Elternklasse?

+0

Brauchen Sie nicht auch ein 'DbSet '? Siehe [hier] (http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph) –

+0

Nein, Ich brauche es nicht. Es ist eine abstrakte Klasse. – koryakinp

+0

Dies könnte einen Versuch wert sein: '_ctx.Entry (Team) .State = EntityState.Modified' legte es vor dem Update-Aufruf. – Cicero

Antwort

2

Aus dieser Antwort, aber das ist eine Abhilfe: Save changes to child class properties using base class query with Entity Framework TPH patten:

Sie Änderungen nicht verfolgen AsNoTracking mit()

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

Ich glaube, Sie einen Blick auf die opened issues related to inheritance haben sollte und kann eine neue Ausgabe öffnen

+0

Vielen Dank Sir. Ich werde es versuchen, aber es sieht sehr hässlich aus .. – koryakinp

+0

Sicher ... Deshalb müssen Sie vielleicht ein Problem öffnen ... Ich denke, weil Sie die Änderungen nicht verfolgen, wenn Sie das Update durchführen, überprüfen Sie den Kontext jede Eigenschaft auf jedes Objekt aber wirklich nicht sicher – Thomas