2017-03-13 1 views
0

Je m'excuse si c'est très trivial, je suis nouveau à OData et j'essaye de mettre en place mon modèle.ODataConventionModelBuilder voit ma propriété List comme un nouvel EntitySet et lance 'L'entité' List_1Of [Type] 'n'a pas de clé définie.'

J'ai besoin cette classe pour elle:

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; } 
} 

J'ajouté à mon ODataConventionModelBuilder:

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

Mais quand j'essayé de courir, j'eu cette erreur:

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

Apparemment, le ODataConventionModelBuilder essaie de transformer mon List<Attendee> en une nouvelle entité Il s'agit d'un type complexe que j'utilise ici dans le cadre du modèle, ce n'est pas une propriété de navigation et il n'est utilisé nulle part ailleurs.

J'ai essayé d'ajouter Attendee à mon modèle comme celui-ci:

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

Mais j'ai eu le même message, j'ai donc essayé de changer le nom EntitySet pour correspondre au nom de l'erreur:

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

Mais encore une fois, cela n'a rien changé.

Pour référence mon backend est RavenDB, et je n'utilise pas Entity Framework.

Je suis vraiment confus, les seuls exemples que j'ai trouvés utilisent une collection de types complexes pour les propriétés de navigation seulement, mais ici c'est juste une simple propriété nécessaire pour mon modèle. Tout avis est le bienvenue

Répondre

0

Si votre classe Attendee ne devrait pas avoir son propre jeu d'entités, vous pouvez définir qu'il est un type complexe comme ceci:

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

Merci, cela a fait l'affaire! Je ne peux pas croire que je n'ai pas repéré cela dans la documentation ... Ils parlent principalement des attributs de la section du constructeur du modèle de la Convention – AlineF

+0

Vous êtes les bienvenus :) – juunas

0

En écrivant HasOptional, vous indiquez à ODATA qu'il s'agit d'une propriété de navigation qui nécessite une clé. Si vous n'avez pas de clé, mais que vous utilisez simplement le Attendees comme une liste simple comme vous le faites avec Tags, vous ne devez pas définir de propriété de navigation.

Lorsque je définis une telle construction que je fais normalement comme ceci:

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