【问题标题】:Not able delete Entity from another Entity container无法从另一个实体容器中删除实体
【发布时间】:2015-10-25 07:23:06
【问题描述】:
//Repository Method

public void Delete(int id)
{
    using (var scope = new UnitOfWork(_container))
    {
        var entity = AuthorService.GetById(id);
        scope.Container.Authors.DeleteObject(entity);
    }     
}

Ninject 绑定

public class LibraryManagerInjectModule : NinjectModule
{
    public override void Load()
    {
        Bind<LibManagerContainer>().To<LibManagerContainer>().InThreadScope();
    }
}

//Author Service Class

public static class AuthorService
{
    private static LibManagerContainer Container
    {
        get { return MF.MF.Get<LibManagerContainer>(); }
    }

    public static Author GetById(int id)
    {
        using (var scope = new UnitOfWork(Container))
        {
            return Container.Authors.SingleOrDefault(x => x.Id == id);
        }
    }

    public static Author GetByName(String name)
    {
        using (var scope = new UnitOfWork(Container))
        {
            return Container.Authors.SingleOrDefault(x => x.Name == name);
        }
    }
}

使用此代码我无法从数据库中删除实体。它向我显示了一个错误,即实体不属于同一个对象状态管理器,但我在 Threadscope 中创建了 libContainer 对象但永远无法删除该实体。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您不需要从数据库加载实体来删除记录。 Id 知足了,又解决了另一个上下文问题:

    var employer = new Employ { Id = 1 };
    ctx.Employ.Attach(employer);
    ctx.Employ.Remove(employer);
    ctx.SaveChanges();
    

    取自这里:Delete a single record from Entity Framework?

    附:你的架构有问题。应在一个范围内使用单个上下文。

    【讨论】:

    • 我认为这不是删除对象的标准化方式,但非常感谢您的回复
    • @AnkitRana,这种方法产生一个 SQL 命令而不是两个,而且,它是来自 MSDN 的官方提示:blogs.msdn.com/b/alexj/archive/2009/03/27/…
    【解决方案2】:

    您用于检索entityDataContext 跟踪实体,以了解对其的更改。因此,您无法使用另一个保存从一个 DataContext(或您的情况下为 UnitOfWork)检索到的实体。
    正如您在 cmets 中提到的,删除应该是另一个事务。为此,您应该按 id 删除,而不是按对象删除。
    只需在AuthorService 中添加RemoveById 方法即可:

    public  static class AuthorService
    {
        ...
    
        public static void RemoveById(int id)
        {
            using (var scope = new UnitOfWork(Container))
            {
                var author = Container.Authors.SingleOrDefault(x => x.Id == id);
                Container.Authors.Remove(author);
            }
        }
        ...
    

    【讨论】:

    • 但这两个trans,action是不同的不同事务,一个是从数据库中读取实体,另一个是删除选中的实体。我在 Threadscope 中使用 Ninject DbContext。那么为什么我们需要传递范围。
    • 因为您正在删除 object。如果您希望这些是 2 个不同的交易,则必须按 id 删除。
    • 感谢您的回复,我关心的是要将 EF Container 实例共享给我们所有的 Web 应用程序。但我认为每个容器对象都有自己的对象状态管理。
    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多