2017-03-13 60 views
0

我很抱歉,如果這是非常微不足道的,我是新的OData,我正在嘗試設置我的模型。ODataConventionModelBuilder將我的List屬性看作一個新的EntitySet,並拋出'實體'List_1Of [Type]'沒有定義鍵'。

我需要這個類來它:

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

如果您Attendee類不應該有自己的實體集,您可以定義它像這麼複雜類型:

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

謝謝你,這個伎倆!不敢相信我沒有在文檔中發現它們......他們主要討論的是Convention模型生成器部分的屬性 – AlineF

+0

不客氣:) – juunas

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"); 
相關問題