设置实体框架时发生多重冲突

时间:2019-04-10 16:36:17

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

我还有一个更复杂的问题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”中无效。由于从属角色属性不是关键属性,因此从属角色多重性的上限必须为'*'。

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

1 个答案:

答案 0 :(得分:1)

由于 Entity Framework 6.x 不支持具有显式外键属性的one-to-one关系,并且如果您尝试使用ForeignKey数据注释来解决它,您将获得迁移过程中的多重性错误。

所以唯一的解决方案是:从RightHandId模型类中删除LeftHandIdLinker属性,如下所示:

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"));
 }