【问题标题】:Removing Objects With a Relationship from DbContext从 DbContext 中删除具有关系的对象
【发布时间】:2017-06-02 18:32:36
【问题描述】:

我最近开始学习 Entity Framework 和 OData,虽然有一个学习曲线,但大多数问题似乎都可以在不寻求帮助的情况下解决。我遇到的这个问题困扰了我一天多,我无法在文档中找到我要查找的内容。

该项目是一个简单的电影数据库;电影有导演和演员,“电影专业人士”有电影的导演和表演功劳。但是,当我尝试删除电影时,我会收到一条错误消息:

"添加与处于已删除状态的实体的关系是 不允许。”

或者一切运行都没有抛出错误,但是演员/导演的状态会恢复到删除调用之前的状态。

这是我正在使用的代码:

protected IHttpActionResult OnDelete(int key)
    {
        if (!Initialized) return NotFound();
        var entity = DeleteOperation(key, DbContext);
        if (entity == null) return NotFound();
        DbSet.Remove(entity);
        DbContext.SaveChanges();
        return StatusCode(HttpStatusCode.NoContent);
    }

protected override Movie DeleteOperation(int key, MovieContext movieContext)
    {
        var removeMovie = movieContext.Movies.FirstOrDefault(key, true, "Cast", "Director");
        if (removeMovie == null) return null;

        if (removeMovie.Cast != null)
        {
            foreach (var actor in removeMovie.Cast)
            {
                actor.Actor =
                    movieContext.Movies.Any(m => m.Key != removeMovie.Key && m.Cast.Any(c => c.Key == actor.Key));
            }
        }

        if (removeMovie.Director != null)
        {
            removeMovie.Director.Director =
                movieContext.Movies.Any(m => m.Key != removeMovie.Key &&
                                             m.Director.Key == removeMovie.Director.Key);
        }

        return movieContext.Movies.FirstOrDefault(key, false);
    }


public static T FirstOrDefault<T>(this DbSet<T> dbset, int key, bool disableTracking, params string[] include)
        where T : ModelBase
    {
        if (dbset == null) return null;
        var query = disableTracking ? dbset.AsNoTracking() : dbset.AsQueryable();
        if (include.Length <= 0) return query.FirstOrDefault(e => e.Key == key);
        var i = 1;
        try
        {
            for (i = 0; i < include.Length; i++)
            {
                query = query.Include(include[i]);
            }
            return query.FirstOrDefault(e => e.Key == key);
        }
        catch (Exception)
        {
            throw new Exception("Include value '" + include[i] + "' has no context");
        }
    }

我感觉演员/导演状态恢复与在我的数据库上下文中调用 .AsNoTracking() 有关,但如果不这样做,我每次都会收到上述错误。据我了解,我需要将CastDirectorMovie 实体中分离出来,但我不知道正确的语法。

【问题讨论】:

标签: c# entity-framework odata


【解决方案1】:

所以我想出的解决方案是在using 语句中创建数据库上下文的新实例。问题是我为DeleteOperation 使用了与OnDelete 相同的数据库上下文实例。这清除了所有错误,让我保存对实体的更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多