Entity Framework таблица соединения "один ко многим" с метаданными

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

У меня есть два основных объекта:

public class Device
{
    [Key]
    public int Id { get; set; }

    public virtual ICollection<Connection> Slaves { get; set; }
}

public class Connection
{
    [Key]
    public int Id { get; set; }

    public virtual Device Master { get; set; }
    public virtual Device Slave  { get; set; }

    public DateTime       Start  { get; set; }
    public DateTime       End    { get; set; }
}

public class Context : DbContext
{
    public virtual DbSet<Device> Devices { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         // Fluent API???
    }
}

На словах: у меня есть класс Device который может содержать несколько ведомых устройств. Ведомые устройства соединяются с использованием таблицы соединений, и их сопоставление действует только в том случае, если End отметка времени меньше текущего времени.

Я пытался заставить его работать с Fluent API, но безрезультатно. Чтобы не затенять мой вопрос, я пока оставлю свои слабые попытки. Мне удалось создать таблицу соединения с соответствующими столбцами FK, но при запросе списка ведомых он возвращает null, Глядя на сгенерированный SQL, он даже не запрашивает таблицу соединений, так что это имеет смысл =)

Не могли бы вы помочь мне получить эту (довольно необычную) связь с работой? Кроме того, если я все делаю неправильно, пожалуйста, дайте мне знать; в камне пока ничего нет.

Спасибо!

ОБНОВИТЬ

Хорошо, так что я получил работу один-ко-многим. Я последовал совету @DavidG и переместил Список рабов в Device класс и сделал это виртуальным. Это казалось важным шагом с момента добавления virtual неожиданно сделал EF запрос таблицы соединений.

Я добавил это в мой контекст:

public class Context : DbContext
{
    public virtual DbSet<Device>     Devices     { get; set; }
    public virtual DbSet<Connection> Connections { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
          // Create a one-to-many for the connections
        modelBuilder.Entity<Device>().HasMany(g => g.Devices).WithRequired(c => c.Master);
        modelBuilder.Entity<Connection>().HasRequired(c => c.Slave).WithMany().WillCascadeOnDelete(false);

        modelBuilder.Entity<Connection>()
            .Property(f => f.Start)
            .HasColumnType("datetime2")
            .HasPrecision(0);

        modelBuilder.Entity<Connection>()
            .Property(f => f.End)
            .HasColumnType("datetime2")
            .HasPrecision(0);
    }
}

И теперь я возвращаю все ведомые устройства по крайней мере (new Context().Devices). Спасибо! Но я все еще не могу понять, как фильтровать свойства подключения, такие как: End == null хоть.

Любая помощь будет оценена!

1 ответ

Попробуй,

public class Device
{
      [Key]
    public int Id { get; set; }

    public ICollection<Connection> Slaves { get; set; }
}

public class Connection
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("Master")]
    public int MasterDeviceId { get; set; }
    [ForeignKey("Slave")]
    public int SlaveDeviceId { get; set; }

    public virtual Device Master { get; set; }
    public virtual Device Slave  { get; set; }

    public DateTime       Start  { get; set; }
    public DateTime       End    { get; set; }
}
Другие вопросы по тегам