Entity Framework Code Первая проблема с навигацией - PullRequest
1 голос
/ 05 апреля 2011

Я пытаюсь настроить свойство навигации, которое будет содержать ноль или более элементов другой таблицы.Проблема Entity Framework, по-видимому, заключается в том, что другая таблица имеет составной первичный ключ.

public class Alpha
{
    public int Id { get; set; }
    public int? BetaId { get; set; }
    public virtual ICollection<Beta> Beta { get; set; }
    public string Name { get; set; }
}

public class Beta
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int SequenceNumber { get; set; }
    public string Name { get; set; }
}

public class ABContext : DbContext
{
    public DbSet<Alpha> Alpha { get; set; }
    public DbSet<Beta> Beta { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Beta>()
            .HasKey(b => new { b.Id, b.SequenceNumber });
    }
}

Я не уверен, как правильно настроить отношения.Я пробовал несколько разных вещей.Entity Framework либо жалуется на то, что не использует обе клавиши из класса Beta для определения свойства навигации, либо создает пару дополнительных столбцов в таблице Alphas, которые неправильно связывают таблицы.

Цель - альфаудерживайте набор из 0 или более бета-версий на основе Beta.Id.Бета-версия может принадлежать нулю или более Альфам.Тем не менее, меня не очень интересуют отношения Бета-Альфа.

Есть идеи?

1 Ответ

1 голос
/ 05 апреля 2011

Итак, давайте посмотрим на ваши требования:

Альфа должна содержать ноль или более Бет .... Бета может принадлежать нолю или более Альф

Это отношение многие-ко-многим, поэтому вы должны отобразить его.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Beta>()
        .HasKey(b => new { b.Id, b.SequenceNumber });

    modelBuilder.Entity<Alpha>()
        .HasMany(a => a.Beta)
        .WithMany();
}

Это создаст дополнительную таблицу в базе данных со столбцами trhee (возможно, называемыми Alpha_Id, Beta_Id и Beta_SequenceNumber).

Я до сих пор не понимаю, что вы подразумеваете под на основе Beta.Id . Если альфа может содержать только записи с одинаковыми бета-версиями, вам, вероятно, придется контролировать это в логике приложения. Это то, что потребует дополнительных сложных конструкций, которые должны быть реализованы с помощью сопоставления.

...