如果这非常微不足道,我很抱歉,我是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,我不使用实体框架。
我真的很困惑,我发现的唯一例子是仅使用导航属性的复杂类型集合,但这里只是我的模型所需的简单属性。欢迎任何建议
答案 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");