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