所以,我有一件衣服:
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以适应我的情况?
答案 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 类中指定外键。