Обновление сущностей с помощью Entity Framework и Cosmos db - PullRequest
0 голосов
/ 30 октября 2019

Во время

_dbContext.Update(entity)

происходят следующие исключения:

System.InvalidOperationException: 'Unable to track an entity of type 'User' because alternate key property 'id' is null. If the alternate key is not used in a relationship, then consider using a unique index instead. Unique indexes may contain nulls, while alternate keys must not.'

Изучите способ, которым я настроил DbContext:

modelBuilder.Entity<User>().HasKey(p => p.Id);

ЗапускСледующая команда sql в эмуляторе космоса возвращает правильную сущность:

SELECT * FROM c where c.Id="My-Guid-Id"

Как обновить существующую сущность, используя Entity Framework в качестве ORM и Cosmos в качестве поставщика моей базы данных?

1 Ответ

1 голос
/ 31 октября 2019

Я проверил на моей стороне, однако все было хорошо на моей стороне.

Мой код:

Item.cs

Для воспроизведения вашей проблемы я использую «ID» вместо «id»

    public class Item
    {
        public Item(string key, string content) => (this.key, this.content) = (key, content);

        public string ID { get; set; } = Guid.NewGuid().ToString();

        public string key { get; set; }

        public string content { get; set; }
    }

CosmosDBContext. cs

    public class CosmosDBContext : DbContext
    {
        public CosmosDBContext(DbContextOptions<CosmosDBContext> options) : base(options)
        {

        }

        public DbSet<Item> Items { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // Set partition key, set container
            modelBuilder.Entity<Item>().ToContainer("JackTest");
            modelBuilder.Entity<Item>().HasKey("ID");
            modelBuilder.Entity<Item>().HasPartitionKey("key");
        }
    }

Создать один элемент:

    _cosmosDBContext.Items.Add(new Item("aaa", "abcdefg"));
    _cosmosDBContext.SaveChanges(true);

Из проводника данных видно, что элемент создан:

enter image description here

И мы видим, что система сгенерирует «id» по умолчанию.

Обновить элемент

    var item = _cosmosDBContext.Items.Where(i => i.content.Equals("abcdefg")).FirstOrDefault();
    item.content = DateTime.Now.ToString("yyyy-MM-ddThh:mm:ss.fffZ") + item.content;
    _cosmosDBContext.Update(item);
    _cosmosDBContext.SaveChanges(true);

И элемент был обновлен:

enter image description here

...