Entity Framework CodeFirst с отношением многие ко многим через DataAnnotations - PullRequest
1 голос
/ 16 марта 2012

Я пытаюсь создать отношение «многие ко многим» между следующими объектами:

public class Classified{
    [Key]
    public int Id {get;set;}    
    public string details {get;set;}
    public ICollection<ClassifiedRating> Ratings {get;set;}  
}

public class User{
    [Key]
    public int Id {get;set;}
    public string Name {get;set;}
}

public class ClassifiedRating{
    [Key]
    public User Rater {get;set;}
    [Key]
    public Classified Classified {get;set;}
    public int rating {get;set;}
}       

При запуске я получаю следующие ошибки:

One or more validation errors were detected during model generation:

\tSystem.Data.Entity.Edm.EdmEntityType: : EntityType 'ClassifiedRating' 
has no key defined. Define the key for this EntityType.

\tSystem.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'ClassifiedRating'
 is based on type 'RateUser' that has no keys defined.

("\ t" также появляются в сообщении об ошибке, хотя я сомневаюсь, что это уместно, это немного странно ....)

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

Насколько я знаю, ключ должен быть либо строкой, целочисленным типом, либо объектом Guid.По сути, это заставляет вас всегда иметь искусственный ключ для каждого класса, который вы хотите сохранить, но обычно это хорошая идея.Попробуйте дать ClassifiedRating целочисленный ключ вместо того, чтобы пытаться использовать класс User.

1 голос
/ 16 марта 2012

ClassifiedRating должно выглядеть следующим образом:

public class ClassifiedRating
{
    [Key, Column(Order = 0)]
    public int RaterId { get; set; }

    [Key, Column(Order = 1)]
    public int ClassifiedId { get; set; }

    public User Rater {get;set;}
    public Classified Classified { get; set; }

    public int rating { get; set; }
}

Соглашения об именах будут определять две части составного первичного ключа как внешний ключ для двух других таблиц, и вы должны получить две однозначные-много отношения, которые вам нужны в вашей модели.

...