2016-04-07 21 views
4

aşağıdaki BaseballDbContext sınıf var:Güncelleme Entity Framework Varlık miras 7

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

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

Ve modeli sınıfları şunlardır: oyuncular tabloda

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

Başlangıçta ekildi veriler:

enter image description here

Şimdi güncelleştirmek istiyorum.210 ve toplarla birinin homeruns özelliği:

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

ben güncelleme var sadece oyuncunun adı kodunu çalıştırdıktan sonra ancak homeruns özelliği: Her iki çocuğun

enter image description here

Nasıl güncellemek için mülk ve ebeveyn sınıfı?

+0

Ayrıca bir DbSet 'a ihtiyacınız var mı? Bakınız [burada] (http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph) –

+0

Hayır, Ona ihtiyacım yok. Bu soyut bir sınıftır. – koryakinp

+0

Bu, çekime değer olabilir: '_ctx.Entry (team) .State = EntityState.Modified', güncelleştirme çağrısından önce bunu koydu. – Cicero

cevap

2
Bu cevap itibaren

ama bu geçici çözüm geçerli: Save changes to child class properties using base class query with Entity Framework TPH patten:

Sana opened issues related to inheritance bir göz gerektiğini düşünüyorum

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

AsNoTracking kullanarak değişiklikleri() izlemek Etmeyin ve mayıs Yeni bir konu aç

+0

numaralı bir sonraki sürümle birlikte satışa sunulacak. Bunu deneyeceğim, ama çok çirkin görünüyor .. – koryakinp

+0

Elbette ... Bu yüzden belki bir sorun açmanız gerekiyor ... Bence değişiklikleri izlemiyorsunuz, güncellemeyi gerçekleştirdiğinizde içerik her özelliği doğrular. her nesnede ama gerçekten emin değil – Thomas