Мое приложение основано на первой структуре сущности кода.Удалить заявление не работает должным образом?
У меня есть модель под названием модуль
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 не работают
спасибо! но как уменьшить количество вызовов для сохранения? – Cybercop
@ Biplov13 в вашем коде 'DeleteModule' вызывает' DeleteOwnedModule', поэтому в этом примере 'DeleteOwnedModule' не нужно вызывать' SaveChanges() '. Вы должны попытаться вызвать 'SaveChanges()' в корне цепочки вызовов, которая изменяет данные - возможно, в точке, в которой ваш «Контекст» выходит из сферы действия (но это зависит от дизайна вашего приложения и того, как долго ваш «Контекст» и т. д.)? Это что-то для вас, чтобы вы подумали, как вы кодируете ... – qujck