2013-07-26 2 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

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

Идея заключается в том, что, когда и хотите добавить новый модуль в систему у просто добавить класс модуля, и OwnedModule это то, что имеет владельца или принадлежит моему кому-то.

Итак, в основном OwnedModule содержит модуль и другие свойства. Вот класс 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 (как это делается для 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().

+0

спасибо! но как уменьшить количество вызовов для сохранения? – Cybercop

+0

@ Biplov13 в вашем коде 'DeleteModule' вызывает' DeleteOwnedModule', поэтому в этом примере 'DeleteOwnedModule' не нужно вызывать' SaveChanges() '. Вы должны попытаться вызвать 'SaveChanges()' в корне цепочки вызовов, которая изменяет данные - возможно, в точке, в которой ваш «Контекст» выходит из сферы действия (но это зависит от дизайна вашего приложения и того, как долго ваш «Контекст» и т. д.)? Это что-то для вас, чтобы вы подумали, как вы кодируете ... – qujck

Смежные вопросы