【问题标题】:Multiplicity conflict while setting up Entity Framework设置实体框架时的多重性冲突
【发布时间】:2019-09-01 04:48:31
【问题描述】:

我有一个更复杂的问题here

但我想我会简化它。

这是我的虚拟类(基于的结构来自 NDC,所以我无法控制它):

public class RightHand
{
    [Key]
    public int RightHandId { get; set; }
    public string PropertyA { get; set; }

    [Required]
    public virtual Linker Linker { get; set; }
}

public class LeftHand
{
    [Key]
    public int LeftHandId { get; set; }
    public string PropertyB { get; set; }

    [Required]
    public virtual Linker Linker { get; set; }
}

public class Linker
{
    [Key]
    public int LinkerId { get; set; }
    [ForeignKey("RightHand")]
    public int RightHandId { get; set; }
    [ForeignKey("LeftHand")]
    public int LeftHandId { get; set; }
    public string PropertyC { get; set; }

    [Required]
    public virtual RightHand RightHand  { get; set; }
    [Required]
    public virtual LeftHand LeftHand  { get; set; }
}

我已经尝试了很多东西,所以希望这个简化的版本可以帮助别人帮助我。

总的来说,我想搜索:

  • LeftHand.PropertyB 并查看 RightHand 的属性
  • 另外,我想搜索 RightHand.PropertyA 并查看 Left Hand 的属性

总而言之,我不关心链接器,除非它是将 LeftHand 链接到 RightHand。 LeftHand 和 RightHand 是一对一的。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RightHand>()
            .Property(x => x.RightHandId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        modelBuilder.Entity<LeftHand>()
            .Property(x => x.LeftHandId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        modelBuilder.Entity<Linker>()
            .Property(x => x.LinkerId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        modelBuilder.Entity<Linker>()
            .HasRequired(nus => nus.LeftHand)
            ;

        modelBuilder.Entity<Linker>()
            .HasRequired(nuu => nuu.RightHand)
            ;
    }

谢谢,我正在使用 VS2017、EF 6.2、Code First、SQL Server

我尝试了不同的注释,但一个常见的错误是:

Linker_LeftHand_Source::多重性在关系“Linker_LeftHand”中的角色“Linker_LeftHand_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是'*'。

Linker_RightHand_Source::多重性在关系“Linker_RightHand”中的角色“Linker_RightHand_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是'*'。

这里与其他多重性答案不同的是中间链接器表。

【问题讨论】:

标签: c# entity-framework code-first ef-code-first-mapping


【解决方案1】:

由于 Entity Framework 6.x 不支持 one-to-one 与显式外键属性的关系,如果您尝试使用 ForeignKey 数据注释解决它,您将在迁移。

因此唯一的解决方案是:从Linker 模型类中删除RightHandIdLeftHandId 属性,如下所示:

public class Linker
{
    [Key]
    public int LinkerId { get; set; }
    public string PropertyC { get; set; }

    public RightHand RightHand { get; set; }
    public LeftHand LeftHand { get; set; }
}

那么你的模型配置应该如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<LeftHand>().HasOptional(l => l.Linker)
            .WithOptionalPrincipal(lf => lf.LeftHand)
            .Map(lf => lf.MapKey("LeftHandId"));

        modelBuilder.Entity<RightHand>().HasOptional(l => l.Linker)
            .WithOptionalPrincipal(lf => lf.RightHand)
            .Map(lf => lf.MapKey("RightHandId"));
 }

【讨论】:

  • 我会试一试...只是对如何为数据库播种感到困惑
  • 映射导航属性!
  • 哇!这是我得到的最接近的。数据库结构正确。左右(嗯,实际的表名)已被填充。播种时,CsvHelper 可能在 Linker.RightHand 和 Linker.LeftHand 上呕吐。
  • 你必须使用.Include(x =&gt; x.Linker)
  • 谢谢。但我发现了原因。导入没有保留我的主键值,它重置了它们,所以没有匹配。我正在研究它...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2015-12-13
  • 1970-01-01
相关资源
最近更新 更多