Entity Framework: запретить установку внешних ключей в null после удаления - PullRequest
0 голосов
/ 16 января 2019

Мне нужно реализовать поведение мягкого удаления. Для этого я переопределил метод 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...