EF Core - удаление связанной сущности из свойства навигации коллекции не обновляет базу данных - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь понять это предложение:

По умолчанию для обязательных отношений настроено каскадное удаление, и дочерняя / зависимая сущность будет удалена из базы данных.

найдено в параграфе «Удаление связей» в документации Microsoft по EF Core: https://docs.microsoft.com/en-us/ef/core/saving/related-data#removing-relationships

В .Net Core API с моделью блога и сообщениями следующим образом

public class Blog
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int BlogId { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

public class Post
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PostId { get; set; }

    public int BlogId { get; set; }
    public virtual Blog Blog { get; set; }
}

Когда я получаю блог по идентификатору через

[HttpGet("{id}")]
public async Task<IActionResult> GetBlog([FromRoute] int id)
{
    return await context.Blog.Where(b => b.BlogId == id)
                             .Include(b => b.Posts).FirstOrDefaultAsync();
}

получаю в JSON

{
  "BlogId": 1,
  "Posts": [
    {
      "PostId": 1
    },
    {
      "PostId": 2
    }
  ]
}

Когда я отправляю обратно в API обновленный следующий JSON для сохранения в базе данных

{
  "BlogId": 1,
  "Posts": [
    {
      "PostId": 2
    }
  ]
}

до

[HttpPut("{id}")]
public async Task<IActionResult> PutBlog([FromRoute] int id, [FromBody] Blog blog)
{
    this.context.Update(blog);
    await this.context.SaveChangesAsync();

    return this.Ok();
}

Все работает нормально, но записи не изменяются.

Поскольку требуется связь между публикацией и блогом, а соответствующая запись удаляется из свойства коллекции записей в блоге, не следует удалять из базы данных сообщение с PostId = 1?

Что меня действительно смущает, так это то, что, как только я использую отношения «многие ко многим» между блогами и публикациями, не меняя ничего в логике, запись в таблице Blog_Post, где PostId = 1 фактически удаляется.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Enity Framework удаляет связанные сущности из принципа сущность в зависимую сущность.В вашем случае Принцип - это Блог, а Пост - это зависимая сущность.При удалении связанных с блогом постов также следует удалять.Вам также необходимо добавить атрибут внешнего ключа, в этом случае ваш класс будет выглядеть так:связанный объект, если вы не хотите удалять связанный объект, тогда используйте ClientSetNull, он будет

model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts)
    .HasForeignKey(p => p. BlogForeignKey)
    .OnDelete(DeleteBehavior.Cascade);
0 голосов
/ 12 марта 2019

Update просто связывает объект и помечает все свойства как измененные. AFAIK это не каскад, или влияет на дочерние коллекции.

Как правило, вам следует избегать передачи сущностей в и из веб-клиента. Если вы принимаете сущность для веб-клиента, очень просто найти вызов, передающий измененную сущность на сервер, применить точку останова и изменить содержимое с помощью отладчика, прежде чем возобновить работу. Если сервер просто присоединяет объект к контексту и сохраняет изменения, я могу изменить данные так, как это не должно разрешать приложение. Это также включает в себя отправку клиенту большего количества информации, чем обычно необходимо.

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

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