2013-07-26 134 views
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 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方法刪除不工作

回答

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(如您的方法ModuleDeleteModule

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

順便說一句,你有很多的呼叫SaveChanges()的。一旦你得到了所有的代碼,你可能需要考慮將呼叫數量減少到SaveChanges()

+0

謝謝!但我如何減少保存變更的電話數量? – Cybercop

+0

@ Biplov13在你的代碼中'DeleteModule'調用'DeleteOwnedModule',所以在這個例子中'DeleteOwnedModule'不需要調用'SaveChanges()'。你應該嘗試在改變數據的調用鏈的根目錄調用'SaveChanges()' - 可能在'Context'超出範圍的地方(但這取決於你的應用程序的設計和諸如你的'Context'等等)?在你編寫代碼時只需要考慮一些事情...... – qujck