保存配置文件对象不会从实体框架中的数据库中删除旧属性

本文关键字:数据库 删除 属性 框架 实体 对象 配置文件 保存 | 更新日期: 2023-09-27 18:36:31

我有一个名为BandyProfile的对象,在我的服务层中,我修改了配置文件并保存。

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

YogaClassesYogaClassICollection

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

问题 - 当我添加初始瑜伽课程并保存时,我很好,但是当我修改(删除一些并添加一些)瑜伽课程并保存时,所有旧条目都不会从表中删除。它们保留在数据库中,新条目将写入新行。

问题 - 我可以在不直接调用YogaClass表的情况下删除BandyProfile的所有旧"瑜伽课程"条目吗?我以为实体框架会看到所做的更改,并在引擎盖下做一些魔法!

_bandyProfileRepository.Save();

做一个context.SaveChanges()

保存配置文件对象不会从实体框架中的数据库中删除旧属性

这是因为您的YogaClass对象需要使用YogaClassIdBandyProfileRefId创建复合主键。

ICollection中删除YogaClass时,BandyProfileRefId将为 null,这违反了主键约束并标记要删除的对象。

请参阅: 实体框架 。删除() 与 .删除对象()

数据注释:(我认为这是正确的语法)

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