A relationship is in the Deleted state

前端 未结 3 461
臣服心动
臣服心动 2020-12-28 13:46

When I am trying to clear a collection (calling .Clear) I get the following exception:

An error occurred while saving entities that do no

相关标签:
3条回答
  • 2020-12-28 14:17

    The only way that I'm aware of to make it work is defining the relationship as an identifying relationship. It would required to introduce the foreign key from Availability to User as a foreign key into your model...

    public int ID { get; set; }
    public int UserID { get; set; }
    public User User { get; set; }
    

    ...and make it part of the primary key:

    modelBuilder.Entity<Availability>()
        .HasKey(a => new { a.ID, a.UserID });
    

    You can extend your mapping to include this foreign key (just to be explicit, it isn't required because EF will recognize it by convention):

    modelBuilder.Entity<Availability>()
        .HasRequired(a => a.User)
        .WithMany(u => u.Availability)
        .HasForeignKey(a => a.UserID);
    

    (BTW: You need to configure the relationship only from one side. It is not required to have both these mappings in your question.)

    Now you can clear the collection with user.Availability.Clear(); and the Availability entities will be deleted from the database.

    0 讨论(0)
  • 2020-12-28 14:25

    In case someone has the same problem using SQLite:

    Unfortunately the accepted answer does not work with SQLite because SQLite does not support auto increment for composite keys.

    You can also override the SaveChanges() Method in the Database context to delete the children:

    //// Long Version
    //var localChilds = this.SubCategories.Local.ToList();
    //var deletedChilds = localChilds.Where(w => w.Category == null).ToList();
    //foreach(var child in deletedChilds) {
    //   this.SubCategories.Remove(child);
    //}
    
    // Short in LINQ
    this.SubCategories.Local
        .Where(w => w.Category == null).ToList()
        .ForEach(fe => this.SubCategories.Remove(fe));
    #endregion
    

    See this great Blogpost as my source (Unfortunately written in german).

    0 讨论(0)
  • 2020-12-28 14:28

    There is one trick. You can delete entities without using special DbSet:

    (this.dataContext as IObjectContextAdapter).ObjectContext.DeleteObject(entity);
    

    Execute this for each item in Availability collection before clearing it. You don't need 'identifying relationships' for this way.

    0 讨论(0)
提交回复
热议问题