Я получаю следующее сообщение об ошибке при попытке удалить элемент из БД:Ошибка при попытке каскадно-удалить
Операция не удалась: Отношения не могут быть изменены, потому что один или несколько из свойства внешнего ключа не имеют значения NULL. Когда происходит изменение отношения, соответствующее свойство внешнего ключа устанавливается равным нулевому значению. Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, для свойства внешнего ключа должно быть назначено другое ненулевое значение, или не связанный с ним объект должен быть удален.
Я читал много тем об этой проблеме, но ни один из них, похоже, не помогает (или, может быть, я их не очень хорошо понимаю).
мои модели:
public class ARDOperation
{
[Key]
public int ARD { get; set; }
[Required]
public virtual ICollection<Act> Actions { get; set; }
public ARDOperation()
{
this.Actions = new List<Act>();
}
}
public class Act
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ARDID { get; set; }
public int ARDOperationId { get; set; }
[ForeignKey("ARDOperationId")]
public virtual ARDOperation ARDOperation { get; set; }
public string Data { get; set; }
[EnumDataType(typeof(ARDState))]
public ARDState State { get; set; }
}
Я также определил свободно API:
public class ARDOperationDBContext : DbContext
{
public DbSet<ARDOperation> ARDOperation { get; set; }
//public DbSet<Act> Act { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Act>()
.HasRequired(t => t.ARDOperation)
.WithMany(t => t.Actions)
.HasForeignKey(d => d.ARDOperationId)
.WillCascadeOnDelete(true);
//modelBuilder.Entity<ARDOperation>()
}
Метод в контроллере:
internal void RemoveAction(int ARDID)
{
var op = ARDOperationDB.ARDOperation.Find(ARDID);
if (op != null)
{
//will not remove the "idle" action
if (op.Actions.Count > 1)
{
Act act = op.Actions.ElementAt(1);
op.Actions.Remove(act);
//ARDOperationDB.Entry(op).State = EntityState.Modified;
ARDOperationDB.SaveChanges();
}
}
}
Я попытался определить «ARDOperationId «свойство как nullable (int?) с использованием подхода, основанного на кодах, и я не получаю никаких ошибок таким образом, но данные ребенка все еще остаются в БД.
Я думаю, что у меня отсутствует что-то, связанное с доступом к модели Act.
Поблагодарит за помощь, Yuval.
Спасибо за ваш ответ. Я уже знал об этом уже от исследования. Я попытался найти больше информации об использовании метода deleteObject, но не смог его получить. Во всяком случае, я нашел ответ. Большое спасибо за попытку. –