ODataConventionModelBuilder 将我的列表 属性 视为新的 EntitySet 并抛出“实体 'List_1Of[Type]' 没有定义键。”

ODataConventionModelBuilder sees my List property as a new EntitySet and throws 'The entity 'List_1Of[Type]' does not have a key defined.'

如果这非常微不足道,我深表歉意,我是 OData 的新手,我正在尝试设置我的模型。

我有一个 class 这样的:

public class EventInfo
{
    public bool Open{ get; set; }
    public List<Attendee> Attendees { get; set; }
    public string Author { get; set; }
    [Required]
    public string Description { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public int Id { get; set; }
    public string Image{ get; set; }
    [Required]
    public string Title { get; set; }
    public string Address{ get; set; }
}

所以我把这个添加到我的 ODataConventionModelBuilder :

builder.EntitySet<EventInfo>("EventInfos");
builder.EntityType<EventInfo>().HasKey(x => x.Id);
builder.EntityType<EventInfo>().HasOptional(x => x.Attendees);

但是当我尝试 运行 它时,我得到了这个错误:

The entity 'List_1OfAttendee' does not have a key defined.

显然 ODataConventionModelBuilder 正试图将我的 List<Attendee> 变成一个需要 ID 的新实体,但这只是我在此处用作模型一部分的复杂类型,它不是导航 属性 且未在其他任何地方使用。

所以我尝试像这样将 Attendee 添加到我的模型中:

builder.EntitySet<Attendee>("Attendees");
builder.EntityType<Attendee>().HasKey(x => x.Name);

但我得到了完全相同的消息,所以我尝试更改 EntitySet 名称以匹配错误中的名称:

builder.EntitySet<Attendee>("List_1OfAttendee");
builder.EntityType<Attendee>().HasKey(x => x.Name);

但同样没有任何改变。

作为参考,我的后端是 RavenDB,我不使用 Entity Framework。

我真的很困惑,我发现的唯一示例是仅将复杂类型的集合用于导航属性,但这里只是我的模型所必需的简单 属性。欢迎任何建议

通过写入 HasOptional,您向 ODATA 表明这是一个需要密钥的导航 属性。如果您没有密钥,而只是像使用 Tags 一样将 Attendees 用作普通列表,则不应定义导航 属性.

当我定义这样一个结构时,我通常是这样的:

// main model
public class Model
{
    public long Id { get; set; }

    public virtual ICollection<NameValuePair> NameValuePairs { get; set; }

    // other properties ...
}

// complex type
public class NameValuePair
{
    public string Name { get; set; }

    public string Value { get; set; }

    // other properties ...
}

// builder
builder.EntitySet<Model>("Models");
builder.EntitySet<NameValuePair>("NameValuePairs");

如果您的 Attendee class 不应该有自己的实体集,您可以定义它是一个复杂类型,如下所示:

builder.ComplexType<Attendee>("Attendees");