【问题标题】:ICollection<enum> as owned property - efcore cosmosdb providerICollection<enum> 作为拥有的属性 - efcore cosmosdb 提供程序
【发布时间】:2022-02-02 15:06:05
【问题描述】:

我有以下 efcore + cosmosdb 提供者配置 + 类:

    public class FooConfiguration : IEntityTypeConfiguration<Foo>
    {
        public void Configure(EntityTypeBuilder<Foo> builder)
        {
            builder
                .ToContainer("Foos")
                .HasPartitionKey(f => f.PartitionKey);
            builder
                .OwnsMany(f => f.EnumValues);
        }
    }

    public class Foo
    {
        public string Id { get; set; }
        public string PartitionKey { get; set; }
        public ICollection<EnumValue> EnumValues { get; set; }
    }

    public enum EnumValue
    {
        Enum1, Enum2
    }

不幸的是,.OwnsMany()TRelatedEntity 具有 class 约束,这意味着它不接受枚举值。

我得到的错误如下:

类型“EnumValue”必须是引用类型才能将其用作泛型类型或方法“EntityTypeBuilder.OwnsMany(Expression>)”中的参数“TRelatedEntity”

我希望集合中的数据看起来像(同时保持枚举约束):

{
...
"EnumValues": [0]
...
},
{
...
"EnumValues": [0,1]
...
}

有没有办法使用拥有的枚举集合?

PS。如果我完全删除 .OwnsMany,我会在运行时收到以下异常:

System.InvalidOperationException:无法映射属性“Foo.EnumValues”,因为它属于“ICollection”类型,它不是受支持的原始类型或有效的实体类型。显式映射此属性,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略它。

【问题讨论】:

  • 您找到解决问题的方法了吗?

标签: c# entity-framework entity-framework-core azure-cosmosdb


【解决方案1】:
public enum EnumValue
    {
        Enum1, Enum2
    }

此属性导致错误,因为它不是实体框架识别用于映射的类型。 将数据类型更改为 int 或 string 等原始数据类型,或删除该属性。

 public ICollection<EnumValue> EnumValues { get; set; }
public enum EnumValue
    {
        Enum1, Enum2
    }

如果你想添加两个 enum 值,像这样给出

public enum EnumValue
    {   
      public datatype Enum1 { get; set; }
      public datatype Enum2 { get; set; }    
    }

请参阅这些链接Link1Link2 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多