2016-02-27 2 views
0

У меня есть объект с именем BandyProfile, и на моем уровне обслуживания я изменяю профиль и сохраняю.Сохранение объекта профиля не удаляет старые свойства из db в инфраструктуре сущности

public void SaveProfile(string userId, System.Collections.Specialized.NameValueCollection request) 
{ 
     BandyProfile bandyProfile = _bandyProfileRepository.Find(userId); 

     bandyProfile.CatchPhrase = request[0]; 
     bandyProfile.StartedPracticing = Convert.ToInt16(request[1]); 
     bandyProfile.Education = request[2]; 
     bandyProfile.Work = request[3]; 
     bandyProfile.WhyIPractice = request[4]; 
     bandyProfile.Inspirations = request[5]; 
     bandyProfile.IsATeacher = Convert.ToBoolean(request[6]); 
     bandyProfile.TrainingCertification = request[7]; 
     bandyProfile.YogaClasses = GetSelectedClasses(request[8]); 
     bandyProfile.StartedTeaching = Convert.ToInt16(request[9]); 
     bandyProfile.WhyITeach = request[10]; 

     _bandyProfileRepository.Save(); 
} 

YogaClasses является ICollection из YogaClass

public class YogaClass 
{ 
    public int YogaClassId { get; set; } 
    public YogaStyle YogaStyle { get; set;} 

    [Index] 
    [Required] 
    public string BandyProfileRefId { get; set; } 

    [ForeignKey("BandyProfileRefId")] 
    public virtual BandyProfile.BandyProfile BandyProfile { get; set; } 
} 

ПРОБЛЕМА - когда я добавить начальные yogaclasses и сохранить Я в порядке, но когда я изменить (удалить некоторые и добавить некоторые) yogaclasses и сохранить , все старые записи не удаляются из таблицы. Они остаются в базе данных, и новые записи записываются в новые строки.

ВОПРОС - Могу ли я удалить все старые записи «YogaClasses» для BandyProfile без прямого вызова таблицы YogaClass? Я подумал, что Entity Framework увидит, какие изменения были сделаны, и сделать волшебство под капотом!

_bandyProfileRepository.Save(); 

делает context.SaveChanges()

ответ

0

Это потому, что ваш YogaClass объект должен создать составной первичный ключ, используя как YogaClassId и BandyProfileRefId.

При удалении YogaClass из ICollection значение BandyProfileRefId будет равно нулю, что нарушает ограничение основного ключа и помещает объект для удаления.

См: Entity Framework .Remove() vs. .DeleteObject()

аннотаций данных: (я думаю, что это правильный синтаксис)

public class YogaClass 
{ 
    [Key] 
    public int YogaClassId { get; set; } 
    public YogaStyle YogaStyle { get; set;} 

    [Key] 
    public string BandyProfileRefId { get; set; } 

    [ForeignKey("BandyProfileRefId")] 
    public virtual BandyProfile.BandyProfile BandyProfile { get; set; } 
} 

Свободный Api:

public class MyDbContext : DbContext 
{ 
    public MyDbContext() 
     : base("DbContext") 
    { 
    } 

    public DbSet<BandyProfile> BandyProfiles { get; set; } 
    public DbSet<YogaClass> YogaClasses { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<YogaClass>() 
      .HasKey(yogaClass => new {yogaClass.YogaClassId, yogaClass.BandyProfileRefId}); 

     base.OnModelCreating(modelBuilder); 
    } 
} 
Смежные вопросы