C# 仅具有1个主键的EntityFramework链接表
所以,我有一件衣服:C# 仅具有1个主键的EntityFramework链接表,c#,entity-framework,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 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以适应我的场景吗?您需要类似以下内容:
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在服装表中。您需要类似以下内容:
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位于表中。如果要使用单向导航属性,可以通过以下方式配置关系:
modelBuilder.Entity<Font>()
.HasMany(f => f.Garments)
.WithOptional();
modelBuilder.Entity<Font>()
.HasMany(f => f.Garments)
.WithOptional(g => g.Font)
.HasForeignKey(g=>g.FontId);
配置方式如下:
modelBuilder.Entity<Font>()
.HasMany(f => f.Garments)
.WithOptional();
modelBuilder.Entity<Font>()
.HasMany(f => f.Garments)
.WithOptional(g => g.Font)
.HasForeignKey(g=>g.FontId);
如果要使用单向导航属性,可以通过以下方式配置关系:
modelBuilder.Entity<Font>()
.HasMany(f => f.Garments)
.WithOptional();
modelBuilder.Entity<Font>()
.HasMany(f => f.Garments)
.WithOptional(g => g.Font)
.HasForeignKey(g=>g.FontId);
配置方式如下:
modelBuilder.Entity<Font>()
.HasMany(f => f.Garments)
.WithOptional();
modelBuilder.Entity<Font>()
.HasMany(f => f.Garments)
.WithOptional(g => g.Font)
.HasForeignKey(g=>g.FontId);
@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类中指定外键。@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类中指定外键。作为一般提示,您所说的是一对多关系。它表达了关系的双方。一种是因为一件衣服有一种字体,另一种是因为一种字体有许多衣服。“多”的概念包括有0、1或更多可能关系的可能性。你在这里建立的是多对多关系。是的,我知道我建立了什么,我需要建立一个0-多关系@弗拉特,你误解我了。一件衣服可以有0到1种字体,字体可以有0到多种。这就是问题所在。@r3副本:我只提到了它,因为您最初在标题中称之为0对多关系。这可能会导致我们的困惑,直到我完全阅读了这个问题,或者对于你来说,如果你在谷歌上搜索到0到多,你可能事先就已经做过的任何研究。我只是觉得最好还是提一下我为什么编辑你的标题,以免将来混淆。啊,对了,我明白了。好的,我将更新标题作为一般提示,你所说的是一对多的关系。它表达了关系的双方。一种是因为一件衣服有一种字体,另一种是因为一种字体有许多衣服。“多”的概念包括有0、1或更多可能关系的可能性。你在这里建立的是多对多关系。是的,我知道我建立了什么,我需要建立一个0-多关系@弗拉特,你误解我了。一件衣服可以有0到1种字体,字体可以有0到多种。这就是问题所在。@r3副本:我只提到了它,因为您最初在标题中称之为0对多关系。这可能会导致我们的困惑,直到我完全阅读了这个问题,或者对于你来说,如果你在谷歌上搜索到0到多,你可能事先就已经做过的任何研究。我只是觉得最好还是提一下我为什么编辑你的标题,以免将来混淆。啊,对了,我明白了。好的,我将更新标题这是它的方式,这样做会在没有为服装定义字体时抛出一个错误。我需要它来允许衣服没有字体,因为不是所有的衣服都有!什么时候投球?在可选关系中,必须检查属性!=在访问它之前为null。否则,在对象上会有一个异常null指针或属性未设置这就是它的方式,当没有为服装定义字体时,以这种方式设置会引发错误。我需要它来允许衣服没有字体,因为不是所有的衣服都有!什么时候投球?在可选关系中,必须检查属性!=在访问它之前为null。否则您将有一个异常null指针或属性未设置在objectNullable上。外键是坏的,不是吗?我认为使用链接表是一种方法。当一端为0-1可选时,可以使用可为null的FK属性来设置,我认为这是您的情况。如果需要字体,则在关系的配置中使用WithRequired方法并删除?在FK propertyNullable中,外键不好,不是吗?我认为使用链接表是一种方法。当一端为0-1可选时,可以使用可为null的FK属性来设置,我认为这是您的情况。如果需要字体,则在关系的配置和删除中使用WithRequired方法 你是谁?在FK属性中