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

时间:2017-03-13 17:27:45

标签: c# odata asp.net-web-api-odata

如果这非常微不足道,我很抱歉,我是OData的新手,我正在尝试建立我的模型。

我需要这个课程:

public class Event 
{
    public bool Advertised { get; set; }
    public List<Attendee> Attendees { get; set; }
    [StringLength(1000)]
    public string Banner { get; set; }
    [Required]
    public string Description { get; set; }
    public Guid? Etag { get; set; }
    [Required]
    public DateTime From { get; set; }
    public string Host { get; set; }
    public int Id { get; set; }
    public List<string> Photos { get; set; }
    public string SponsorsSummary { get; set; }
    public string SponsorsTitleText { get; set; }
    [StringLength(1000)]
    public string Summary { get; set; }
    public IList<string> Tags { get; set; }
    public int Target { get; set; }
    [StringLength(1000)]
    public string Thumbnail { get; set; }
    [Required]
    public string Title { get; set; }
    public DateTime? To { get; set; }
    public Address Venue { get; set; }
    public string VenueDetails { get; set; }
    [Required]
    public bool Viewable { get; set; }
}

所以我将其添加到我的ODataConventionModelBuilder

builder.EntitySet<Event>("Events");
builder.EntityType<Event>().HasKey(x => x.Id);
builder.EntityType<Event>().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,我不使用实体框架。

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

2 个答案:

答案 0 :(得分:0)

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

当我定义这样的构造时,我通常会这样做:

// 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");

答案 1 :(得分:0)

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

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