Entity Framework Code 1 - Отображение многих ко многим с дополнительной информацией - PullRequest
1 голос
/ 16 сентября 2011

Я просмотрел несколько вопросов здесь и не совсем соединил все (ментальные) точки этого. Буду признателен за помощь.

Мои модели (сначала код):

public class cgArmorial
{
    [Key]
    [Display(Name = "Armorial ID")]
    public Guid ArmorialID { get; set; }
    [Display(Name = "User ID")]
    public Guid UserId { get; set; }
    public string Name { get; set; }
    public string DeviceUrl { get; set; }
    public string Blazon { get; set; }

    public virtual ICollection<cgArmorialAward> ArmorialAwards { get; set; }
}

public class cgArmorialAward
{
    public cgArmorial Armorial { get; set; }
    public cgAward Award { get; set; }
    public DateTime AwardedOn { get; set; }
}
public class cgAward
{
    [Key]
    [Display(Name = "Award ID")]
    public Guid AwardID { get; set; }
    public string Name { get; set; }
    public string Group { get; set; }
    public string Description { get; set; }
    public string ImageUrl { get; set; }
    public string Blazon { get; set; }

    public virtual ICollection<cgArmorialAward> ArmorialAwards { get; set; }
}

Тогда в моем классе Context у меня есть (последние 2 записи):

public class Context : DbContext
{
    public DbSet<cgUser> Users { get; set; }
    public DbSet<cgEvent> Events { get; set; }
    public DbSet<cgEventType> EventTypes { get; set; }
    public DbSet<cgArmorial> Armorials { get; set; }
    public DbSet<cgAward> Awards { get; set; }
    public DbSet<cgArmorialAward> ArmorialAwards { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<cgUser>()
                    .HasMany<cgEvent>(e => e.EventAutocrats)
                    .WithMany(u => u.EventAutocrats)
                    .Map(m =>
                    {
                        m.ToTable("EventAutocrats");
                        m.MapLeftKey("UserId");
                        m.MapRightKey("EventId");
                    });
        modelBuilder.Entity<cgUser>()
                    .HasMany<cgEvent>(e => e.EventStaff)
                    .WithMany(u => u.EventStaff)
                    .Map(m =>
                    {
                        m.ToTable("EventStaff");
                        m.MapLeftKey("UserId");
                        m.MapRightKey("EventId");
                    });
        modelBuilder.Entity<cgArmorialAward>()
                    .HasRequired(a => a.Armorial)
                    .WithMany(b => b.ArmorialAwards);
        modelBuilder.Entity<cgArmorialAward>()
                    .HasRequired(a => a.Award)
                    .WithMany();    // b => b.ArmorialAwards
    }
}

Я получаю эту ошибку при попытке запустить:

System.Data.Edm.EdmEntityType:: EntityType 'cgArmorialAward' не имеет ключ определен. Определите ключ для этого EntityType. System.Data.Edm.EdmEntitySet: EntityType: EntitySet ArmorialAwards основан на типе «cgArmorialAward», для которого не определены ключи.

1 Ответ

4 голосов
/ 16 сентября 2011

Ну, как говорится в исключении: у вас нет ключа, определенного в вашей сущности cgArmorialAward. У каждой сущности должен быть ключ. Измените его на следующее:

public class cgArmorialAward
{
    [Key, Column(Order = 0)]
    [ForeignKey("Armorial")]
    public Guid ArmorialID { get; set; }

    [Key, Column(Order = 1)]
    [ForeignKey("Award")]
    public Guid AwardID { get; set; }

    public cgArmorial Armorial { get; set; }
    public cgAward Award { get; set; }
    public DateTime AwardedOn { get; set; }
}

Поля в составном ключе являются внешними ключами для двух других таблиц одновременно, следовательно, атрибут ForeignKey. (Я не уверен, что соглашения определят это автоматически, потому что у вас есть нестандартные имена («cgXXX» для классов и «XXXId» для свойств внешнего ключа). С другой стороны, имена свойств Armorial и Award соответствовать именам свойств внешнего ключа. Я не уверен, что соглашения EF будут учитывать это. Поэтому, возможно, атрибут ForeignKey не является необходимым, но по крайней мере он не ошибается.)

...