当我没有该类型的DbSet时,如何删除该实体?

本文关键字:何删除 删除 实体 类型 DbSet | 更新日期: 2023-09-27 18:12:54

我正在使用已提供的DbContext,我无法更改它。

为简洁而编辑,上下文包含两种类型

public class LogPost {
    public int ID { get; set; }
    public string Comment { get; set; }
    public virtual ICollection<LogReply> Replies { get; set; }
    public LogPost() {
        Replies = new List<LogReply>();
    }
}
public class LogReply {
    public int ID { get; set; }
    public string Comment { get; set; }
}

没有DbSet<LogReply>,只有DbSet<LogPost>。如果我尝试从post.Replies集合中删除回复,它会抛出一个关于外键属性不为空的异常(如预期的那样)。

如何删除回复?

当我没有该类型的DbSet时,如何删除该实体?

我知道你无法改变现有的DbContext实现,但是为DbContext创建DbSet<T>的方法是公开的(见这里)。

那么你可以试试下面的命令:

using(var db = new Context())
{
    var post = db.LogPosts.First(p => p.ID == postID);
    var reply = post.Replies.First(r => r.ID == replyID);
    var logReplies = db.Set<LogReply>();
    logReplies.Remove(reply);
    db.SaveChanges();
}

我使用的解决方案是获取实体的DbEntityEntry并手动将其标记为已删除。

using (var db = new Context()) {
    var post = db.LogPosts.First(p => p.ID == postID);
    var reply = post.Replies.First(r => r.ID == replyID);
    db.Entry(reply).State = System.Data.Entity.EntityState.Deleted;
    db.SaveChanges();
}