实体框架一对多连接表与元数据

时间:2015-08-24 12:28:11

标签: c# entity-framework ef-fluent-api

我试图在实体框架中实现一些连接表,但我似乎无法获得任何结果。

我有两个主要对象:

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

任何帮助将不胜感激!

1 个答案:

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