Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅具有1个主键的EntityFramework链接表_C#_Entity Framework - Fatal编程技术网

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属性中