Мне нужно реализовать поведение мягкого удаления. Для этого я переопределил метод SaveChanges () объекта DbContext следующим образом:
public override int SaveChanges()
{
var deletableEntries = ChangeTracker.Entries<IDeletable>().Where(e => e.State == EntityState.Deleted);
foreach (var entry in deletableEntries)
{
entry.State = EntityState.Modified;
entry.Entity.Deleted = true;
}
return base.SaveChanges();
}
Но когда сущность удаляется из DbSet, ее внешние ключи сбрасываются в нуль:
var context = new MyContext();
var entity = context.Citizens.FirstOrDefault(e => e.CityCode == "001");
if (entity != null)
{
context.Citizens.Remove(entity); // After that, entity.CityCode becomes Null
context.SaveChanges();
}
Почему это происходит и как это предотвратить?
Модель:
public class City
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key]
public string Code { get; set; }
public string Name { get; set; }
public virtual ICollection<Citizen> Citizens { get; set; }
}
public class Citizen: IDeletable
{
public int Id { get; set; }
[Required]
public string CityCode { get; set; }
public virtual City City { get; set; }
public string Name { get; set; }
public bool Deleted { get; set; }
}
Конфигурация модели:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Citizen>()
.HasRequired(e => e.City)
.WithMany(e => e.Citizens)
.HasForeignKey(e => e.CityCode)
.WillCascadeOnDelete(false);
}
Версия Entity Framework: 6.1.3