EntityFramework仅包含1个主键的链接表

时间:2015-05-08 14:05:23

标签: c# entity-framework

所以,我有一件衣服:

public class Garment
{
    public int Id { get; set; }
    public string Slug { get; set; }

    public Kit Kit { get; set; }
    public IList<Path> Paths { get; set; }
}

和一个字体:

public class Font
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Slug { get; set; }

    public IList<Garment> Garments { get; set; }
}

服装可以有字体,字体可以有0到多个服装。 我试图通过这样做来在EF中做到这一点:

// Map the GarmentFonts table
modelBuilder.Entity<Font>()
    .HasMany(m => m.Garments)
    .WithMany()
    .Map(m =>
    {
        m.MapLeftKey("FontId");
        m.MapRightKey("GarmentId");
        m.ToTable("GarmentFonts");
    });

但它已将 FontId GarmentId 作为主键。真的,我认为应该只有 GarmentId 作为主要关键来阻止系统允许服装使用多种字体。 有谁知道如何设置EF以适应我的情况?

3 个答案:

答案 0 :(得分:4)

你需要这样的东西:

public class Garment {
    public int Id { get; set; }
    public string Slug { get; set; }

    public Kit Kit { get; set; }
    public IList<Path> Paths { get; set; }

    public Font Font {get; set;}
}

配置:

modelBuilder.Entity<Font>()
    .HasMany(m => m.Garments)
    .WithOptional(y => y.Font);

此处不需要链接表。 FK在服装表中。

答案 1 :(得分:0)

如果您想使用单向导航属性,可以这样配置您的关系:

modelBuilder.Entity<Font>()
    .HasMany(f => f.Garments)
    .WithOptional();

但我建议您在Font实体和FK上添加Garment导航属性:

public class Garment
{
  public int Id { get; set; }
  //...
  public int? FontId { get; set; }
  public Font Font {get; set;}
}

配置就是这样:

modelBuilder.Entity<Font>()
            .HasMany(f => f.Garments)
            .WithOptional(g => g.Font)
            .HasForeignKey(g=>g.FontId);

答案 2 :(得分:0)

@octavioccl实际上回答了它,但我不喜欢POCO类中对FontId的引用,所以我改变了我的意思:

public class Garment
{
    public int Id { get; set; }
    public string Slug { get; set; }

    public Kit Kit { get; set; }
    public Font Font { get; set; }
    public IList<Path> Paths { get; set; }
}

我将 Font 类保持完全相同,在 DbContext 类中,我将其替换为:

// Map the GarmentFonts table
modelBuilder.Entity<Font>()
    .HasMany(m => m.Garments)
    .WithMany()
    .Map(m =>
    {
        m.MapLeftKey("FontId");
        m.MapRightKey("GarmentId");
        m.ToTable("GarmentFonts");
    });

有了这个:

modelBuilder.Entity<Garment>().HasOptional(m => m.Font).WithMany(m => m.Garments).Map(m => { m.MapKey("FontId"); });

就像我说的,这与@actavioccl相同,但无需在 Garment 类中指定外键。