0

我的应用程序基于代码优先实体框架。

我有模型称为模块

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 的模型类

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();
    }
}

如果我必须删除 Module,我首先必须从 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 方法不起作用,我收到错误消息,为什么会发生这种情况?我需要什么才能使我的 Delete 语句起作用?

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 表中删除。这也有效,但从存储库中的方法中删除不起作用

4

1 回答 1

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().

于 2013-07-26T10:02:56.700 回答