从连接3个表的接线表中删除EF



我当前正在尝试实现连接3个表的接线表。我坚持从这张桌子上删除物品。

连接表由表和导航属性的键和相关实体组成。(我简化了这一点,在完整的代码中,它具有用于备份字段的实现)

[Table("SeasonHasBroadcast")]
public partial class SeasonHasBroadcastModel : BaseModel
{
    [Key]
    [Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int SeasonShow {get; set;}
    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int SeasonNumber {get; set;}
    [Key]
    [Column(Order = 2)]
    [StringLength(45)]
    public string AirtimeDay {get; set;}
    [Key]
    [Column(Order = 3)]
    public TimeSpan AirtimeTime {get; set;}     
    [Key]
    [Column(Order = 4)]
    [StringLength(45)]
    public string NetworkName {get; set;}
    public virtual AirtimeModel AirtimeLink {get; set;}
    public virtual NetworkModel NetworkLink {get; set;}
    public virtual SeasonModel SeasonLink {get; set;}
}

连接的表具有public virtual ICollection<SeasonHasBroadcastModel> SeasonHasBroadcasts { get; set; }

当我在此关系中添加新实体时,我只会在此表中添加新实体。问题是,当我尝试删除实体时。

我尝试的是用SeasonViewModel.Season.SeasonHasBroadcasts.Remove(selected);删除。这样,我将从其他连接2个表的接线表中删除。这些表只是没有单独的表,仅通过收藏来存在。其他尝试是通过导航属性,我从每个集合中删除了selected实体。

这两个给我带来了这个错误:

属性"季节"是对象关键信息的一部分,无法修改。

当我调试并查看dbcontext时,它在节目,播放时间和网络实体上显示了此错误,但在交界处没有。

如何从桌子上删除?

编辑

public class BaseModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

dbContext:

modelBuilder.Entity<AirtimeModel>()
    .HasMany(e => e.SeasonHasBroadcasts)
    .WithRequired(e => e.AirtimeLink)
    .HasForeignKey(e => new { e.AirtimeDay, e.AirtimeTime })
    .WillCascadeOnDelete(false);
modelBuilder.Entity<NetworkModel>()
    .HasMany(e => e.SeasonHasBroadcasts)
    .WithRequired(e => e.NetworkLink)
    .WillCascadeOnDelete(false);
modelBuilder.Entity<SeasonModel>()
    .HasMany(e => e.SeasonHasBroadcasts)
    .WithRequired(e => e.SeasonLink)
    .HasForeignKey(e => new { e.SeasonShow, e.SeasonNumber })
    .WillCascadeOnDelete(false);
modelBuilder.Entity<SeasonHasBroadcastModel>()
    .Property(e => e.AirtimeDay)
    .IsUnicode(false);
modelBuilder.Entity<SeasonHasBroadcastModel>()
    .Property(e => e.NetworkName)
    .IsUnicode(false);

编辑2命令用于删除广播 公共覆盖void Execute(对象参数) { var parrentViewModel =(seleseviewModel)parrentViewModel; var selected = parrentViewModel.SelectedBroadcast;

    if (selected == null) return;
    if (parrentViewModel.Season.SeasonHasBroadcasts.Contains(selected))
    {
        //selected.SeasonLink.SeasonHasBroadcasts.Remove(selected);
        //selected.AirtimeLink.SeasonHasBroadcasts.Remove(selected);
        //selected.NetworkLink.SeasonHasBroadcasts.Remove(selected);
        parrentViewModel.BroadcastsViewModel.Service.DeleteData(selected);
        //parrentViewModel.Service.Context.SeasonHasBroadcasts.Remove(selected);
        //parrentViewModel.Season.SeasonHasBroadcasts.Remove(selected);
    }
    parrentViewModel.SelectedBroadcast = null;
}

添加广播的命令:

public override void Execute(object parameter)
{
    var parrentViewModel = (SeasonViewModel)ParrentViewModel;
    parrentViewModel.NewBroadcast.SeasonLink = parrentViewModel.Season;
    if (!parrentViewModel.Season.SeasonHasBroadcasts.Contains(parrentViewModel.NewBroadcast))
    {
        parrentViewModel.Season.SeasonHasBroadcasts.Add(parrentViewModel.NewBroadcast);
    }
    parrentViewModel.NewBroadcast = new SeasonHasBroadcastModel();
}

服务:(这是今天的尝试,仍然无法解决,同样的错误)

public override void DeleteData(SeasonHasBroadcastModel toDelete)
{
    if (toDelete.AirtimeLink != null && Context.Entry(toDelete.AirtimeLink).State == EntityState.Detached)
        Context.Airtimes.Attach(toDelete.AirtimeLink);
    if (toDelete.NetworkLink != null && Context.Entry(toDelete.NetworkLink).State == EntityState.Detached)
        Context.Networks.Attach(toDelete.NetworkLink);
    if (toDelete.SeasonLink != null && Context.Entry(toDelete.SeasonLink).State == EntityState.Detached)
        Context.Seasons.Attach(toDelete.SeasonLink);
    base.DeleteData(toDelete);
}

base.deletedata:

public virtual void DeleteData(TModel toDelete)
{
    _context.Set<TModel>().Remove(toDelete);
}

因此,在与我的大学的教授咨询后,我们可能会在SQL Server上存储"最简单"的解决方案。它不是最好的支出,而是它的工作。仍然想知道,如何在没有存储过程的情况下执行此操作。

最新更新