我的应用程序基于代码第一实体框架。
我有一个名为模块的模型
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中的方法中删除不起作用
答案 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()
的调用次数。