我的應用程序基於代碼第一個實體框架。刪除語句無法正常工作?
我有模型稱爲模塊
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; }
}
的想法是,當u希望新的模塊添加到系統U的只是添加模塊類,並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表中刪除它,然後從模塊表中刪除它。如果它有一個所有者。
在我的倉庫,這是我做了什麼:
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表要先然後從模塊表中的模塊。此作品太多,但在repopsitory方法刪除不工作
謝謝!但我如何減少保存變更的電話數量? – Cybercop
@ Biplov13在你的代碼中'DeleteModule'調用'DeleteOwnedModule',所以在這個例子中'DeleteOwnedModule'不需要調用'SaveChanges()'。你應該嘗試在改變數據的調用鏈的根目錄調用'SaveChanges()' - 可能在'Context'超出範圍的地方(但這取決於你的應用程序的設計和諸如你的'Context'等等)?在你編寫代碼時只需要考慮一些事情...... – qujck