Не удалось обновить базу данных Cosmos. Невозможно привести Guid к строке. - PullRequest
0 голосов
/ 18 марта 2020

Пытался обновить запись Cosmos DB в ASP. NET core 3.1. Но обновление завершается неудачно со следующим сообщением: «Невозможно привести объект типа 'System.Func'2[Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry,System.Guid]' to type 'System.Func'2[Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry,System.String]'

Ошибка происходит на saveCangesAsyn c (); Упрощенно, код выглядит так:

// The service
public async Task<Todo> UpdateAsync(Todo entity)
{
  var response = ctx.Todos.Update(entity);
  await ctx.SaveChangesAsync(); // Error here
  return response.Entity;
}

// The entity Todo
public class Todo
{
  public Guid id { get; set; }
  [Required(ErrorMessage = "Description is required")]
  public string description { get; set; }
  ...
}

// The context
public class TodoDbContext : DbContext
{
    public DbSet<Todo> Todos { get; set; }
    public TodoDbContext(DbContextOptions<TodoDbContext> options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultContainer("Todos");
    }
}

// The controller
[HttpPut]
public async Task<IActionResult> Put(Todo todo)
{
    try
    {
        if (ModelState.IsValid)
        {
            Todo td = await service.GetAsync(todo.id.ToString());

            if (td != null)
            {
                td.description = todo.description;
                var response = await service.UpdateAsync(td);
                return Ok(response);
            }

            return BadRequest("Not found.");
        }
        else
        {
            return BadRequest(ModelState);
        }
    }
    catch (Exception ex)
    {
        return BadRequest(ex.Message);  // Exception here
    }
}

Я могу вставлять, читать, но не обновлять, поэтому следующий код работает нормально (также с Guid)

public async Task<Todo> CreateAsync(Todo entity)
{
    entity.id = Guid.NewGuid();
    var response = await ctx.Todos.AddAsync(entity);
    await ctx.SaveChangesAsync();
    return response.Entity;
}

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 19 марта 2020

Есть ли причина, по которой вы используете Guid в качестве типа идентификатора? В вашем классе Todo вы могли бы написать это так:

public class Todo
{
    [JsonProperty("id")
    public string Id { get; set; }

    [JsonProperty("description")
    [Required(ErrorMessage = "Description is required")]
    public string description { get; set; }
}

Я предполагаю, что вы используете v3 из SDK Cosmos DB. Затем вы просто используете Guid.NewGuid (). ToString (), чтобы установить идентификатор как Guid (но как тип строки).

0 голосов
/ 18 марта 2020

Не используйте «id», это будет конфликтовать с автоматически сгенерированным id. Чтобы решить проблему, используйте другое свойство или «Id» (с заглавной буквой I).

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