Entity Framework Core,无法在 PrimaryKey 上设置 HasName

Ale*_*olo 6 entity-framework entity-framework-core .net-core azure-cosmosdb

我正在尝试使用 Entity Framework Core 访问 CosmosDB 集合。

我的数据库有各种数据,但主键是“id”我的模型有一个子集,但使用“Id”而不是“id”。

我已经检查过我能够读/写一个测试数据库,它包含一个“id”的副本作为“Id”。这不会导致任何问题。

据我所知,https: //docs.microsoft.com/en-us/ef/core/modeling/indexes 应该可以设置“HasName”属性。

[DataContract]
[Serializable]
public class TestModel
{
    [DataMember] 
    [JsonProperty("id")] 
    public string Id { get; set; }

    [DataMember] 
    public string Pid { get; set; }
}


protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<TestModel>().ToContainer("TestModel");
    modelBuilder.Entity<TestModel>().HasPartitionKey(x => x.Pid);
    modelBuilder.Entity<TestModel>().HasNoDiscriminator();

    modelBuilder.Entity<TestModel>().HasKey(b => b.Id).HasName("id");
}
Run Code Online (Sandbox Code Playgroud)

使用这个,我仍然得到一个错误。

InvalidOperationException:无法跟踪类型为“TestModel”的实体,因为主键属性“Id”为空。

我也曾在反复试验中,尝试使用。- HasName + HasKey / HasIndex - HasColumnName + 属性

Cas*_*tra 0

这似乎是由EF Core 3.0 中的重大更改引起的,可以在此处找到这些更改。

你也许可以通过数据注释来解决它[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

public class TestModel
{
    [DataMember] 
    [JsonProperty("id")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string Id { get; set; }
(...)
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,第二种解决方案是为 id 分配一个 GUID。有关更多信息,请参阅此讨论/sf/answers/4139408521/