删除声明无法正常工作?

时间:2013-07-26 08:52:56

标签: asp.net-mvc entity-framework asp.net-mvc-4 entity

我的应用程序基于代码第一实体框架。

我有一个名为模块的模型

public class Module
{
    public long Id { get; set; }
    public long ModuleTypeId { get; set; }
    public ModuleType ModuleType { get; set; }
    public string ModuleId { get; set; }
    public PropertyConfiguration PropertyConfiguration { get; set; }
    public DateTime DateEntered { get; set; }
}

另一个名为OwnedModule的Model类

public class OwnedModule
{
    public long Id { get; set; }
    public PropertyConfiguration PropertyConfiguration { get; set; }

    public long ModuleTypeId { get; set; }
    public ModuleType ModuleType { get; set; }
    public string ModuleId { get; set; }


    public Guid ModuleOwnerId { get; set; }
    public Module Module { get; set; }

    public DateTime Start { get; set; }
    public DateTime? End { get; set; }
}

这个想法是,当你想要将新模块添加到系统中时,你只需添加Module类,而OwnedModule就是拥有所有者或拥有我的人。

因此,基本上OwnedModule包含Module和其他属性。这是OwnedMOduleMap类

public class OwnedModuleMap : EntityTypeConfiguration<OwnedModule>
{
    public OwnedModuleMap()
    {
        Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        HasKey(x => x.Id);
        HasOptional(x => x.PropertyConfiguration).WithOptionalPrincipal().WillCascadeOnDelete();
        HasRequired(x => x.ModuleType).WithMany().HasForeignKey(x => x.ModuleTypeId);

        HasOptional(x => x.Module).WithOptionalDependent();
    }
}

如果我必须删除模块,我首先必须从OwnedModules表中删除它,然后从Modules表中删除它。如果它的拥有者是。

在我的存储库中,这就是我所做的:

     public void DeleteModule(long id)
    {
        var module = _dbSis.Modules.FirstOrDefault(t=>t.Id==id);
        DeleteOwnedModule(module.ModuleId);
        _dbSis.Entry(module).State = EntityState.Deleted;
        _dbSis.SaveChanges();
    }

    public long GetOwnedModuleId(string moduleId)
    {
        var ownedModule= _dbSis.OwnedModules.FirstOrDefault(t => t.ModuleId == moduleId);
        if (ownedModule != null)
        {
            return ownedModule.Id;
        }
        return 0;
    }

    public void DeleteOwnedModule(string moduleId)
    {
        var ownedModuleId = GetOwnedModuleId(moduleId);
        var ownedModule = new OwnedModule
            {
                Id = ownedModuleId
            };
        _dbSis.Entry(ownedModule).State = EntityState.Deleted;
        _dbSis.SaveChanges();
    }

但是现在我的DeleteOwnedModule方法无效,我得到错误说,为什么会发生这种情况?我需要做什么才能使我的删除声明有效?

ObjectStateManager中已存在具有相同键的对象。 ObjectStateManager无法使用相同的键跟踪多个对象。

PS:如果我在添加模块时没有设置所有者,那么删除它时没有问题。

  public void DeleteModule(long id)
    {
        var module = _dbSis.Modules.FirstOrDefault(t=>t.Id==id);
        //DeleteOwnedModule(module.ModuleId);
        _dbSis.Entry(module).State = EntityState.Deleted;
        _dbSis.SaveChanges();
    }

这完全有效,如果我要手动删除它,那么我可以先打开数据库从OwnedModules表中删除我想要的模块然后从Modules表中删除。这也有效,但从repopsitory中的方法中删除不起作用

1 个答案:

答案 0 :(得分:0)

问题是这个方法:

public void DeleteOwnedModule(string moduleId)
{
    var ownedModuleId = GetOwnedModuleId(moduleId);
    var ownedModule = new OwnedModule
        {
            Id = ownedModuleId
        };
    _dbSis.Entry(ownedModule).State = EntityState.Deleted;
    _dbSis.SaveChanges();
}

您正在使用现有OwnedModule创建新的id。您需要做的是Find现有模块并将实例的设置为Deleted(就像您在方法Module中对DeleteModule所做的那样)

public void DeleteOwnedModule(long id)
{
    var ownedModule = _dbSis.OwnedModules.FirstOrDefault(t=>t.Id==id);
    _dbSis.Entry(ownedModule).State = EntityState.Deleted;
    _dbSis.SaveChanges();
}

顺便提一句,您有很多来电SaveChanges()。一旦您完成了所有代码的工作,您可能需要考虑减少对SaveChanges()的调用次数。