Может быть, я неправильно понял метод обновления Entity Framework? - PullRequest
0 голосов
/ 27 апреля 2020

Используя Web API, я хочу обновить одну запись и две таблицы отношений m-to-n в методе PUT. Для этого я нашел метод обновления Entity Framework. Однако мой код ниже ничего не делает. Возможно ли, что я что-то там неправильно понял?

[HttpPut("Roles/{roleID}")]
public async Task<ActionResult> UpdateRole(int roleID, Role updatedRole) {
    // Validate data
    if (roleID != updatedRole.ID)
        return BadRequest("ID missmatch.");

    if (!updatedRole.Validate(out string problems))
        return BadRequest(problems);

    // Apply modified relations
    updatedRole.ApplyModifiedRelations();

    // Setup db connection
    MpaContext db = _mpaContext;

    Response.RegisterForDispose(db);

    // Save changes
    db.Update(updatedRole);

    // I've added these two afterwords, but it also doesn't update anything
    if (updatedRole.HasModifiedClientIDs)
        db.UpdateRange(updatedRole.ClientRoles);

    if(updatedRole.HasModifiedViewerIDs)
        db.UpdateRange(updatedRole.RoleViewers);

    try {
        await db.SaveChangesAsync();

    } catch (Exception ex) {
        return Problem(ex.Message);

    }

    return Ok();
}

public void ApplyModifiedRelations() {
    if (HasModifiedClientIDs) { 
        ClientRoles = new List<ClientRole>(
            _ClientIDs.Select(c => new ClientRole() { ClientID = c, RoleID = ID })
        );
    }

    if (HasModifiedViewerIDs) {
        RoleViewers = new List<RoleViewer>(
            _ViewerIDs.Select(v => new RoleViewer() { RoleID = ID, ViewerID = v })
        );
    }
}

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Я нашел решение. Вы должны загрузить отношения перед обновлением. Я изменил свой метод ApplyModifiedRelations соответственно:

public async Task ApplyModifiedRelations(MpaContext db) {
    if (HasModifiedClientIDs) {
        await db.Entry(this).Collection(r => r.ClientRoles).LoadAsync();

        ClientRoles = new List<ClientRole>(
            _ClientIDs.Select(c => new ClientRole() { ClientID = c, RoleID = ID })
        );
    }

    if (HasModifiedViewerIDs) {
        await db.Entry(this).Collection(r => r.RoleViewers).LoadAsync();

        RoleViewers = new List<RoleViewer>(
            _ViewerIDs.Select(v => new RoleViewer() { RoleID = ID, ViewerID = v })
        );
    }
}

Я также переместил этот вызов метода ниже вызова db.Update. Но я не знаю, имеет ли это какое-то значение.

0 голосов
/ 27 апреля 2020

Я думаю, что ваш объект не существует в контексте БД (потому что вы получаете его из запроса). Так что EF не может обновить его. Попробуйте это

db.Entry(updatedRole).State = EntityState.Modified;
db.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...