我试图在实体框架中实现一些连接表,但我似乎无法获得任何结果。
我有两个主要对象:
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的建议,将Slaves List移到了Device
类,并将其变为虚拟。这似乎是一个关键的步骤,因为添加virtual
突然使EF查询Connections表。
我将此添加到我的上下文中:
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
。
任何帮助将不胜感激!
答案 0 :(得分:0)
试试,
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; }
}