EF代码首先是一对多,反向一对一的关系

Amm*_*han 4 entity-framework ef-code-first

我正在尝试使用代码创建一对多和反向一对一的关系.这是我想做的事情

1)两个类之间的一对多,它按预期工作.

    public class X
    {
        [Key]
        public int XId { get; set; }
        public ICollection<Y> Y { get; set; }

    }

    public class Y
    {
        [Key]
        public int YId { get; set; }
        public int XId { get; set; }
        public X X { get; set; }
    }

    public class DataContext : DbContext
    {
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Y>()
                .HasRequired(y => y.X)
                .WithMany(x => x.Y)
                .HasForeignKey(y => y.XId);
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在我要做的是在Y和X之间创建Reverse One-to-One可选关系,这样X将包含Y的外键......怎么可能?这是我想要做的,它抛出一些Multiplicity错误

       public class X
        {
            [Key]
            public int XId { get; set; }
            public ICollection<Y> Y { get; set; }
            public int YId {get; set; }
            [ForiegnKey("YId")]
            public Y YOptional { get; set; }
        }

        public class Y
        {
            [Key]
            public int YId { get; set; }
            public int XId { get; set; }
            public X X { get; set; }
            public X XOptional {get; set; }
        }

        public class DataContext : DbContext
        {
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Y>()
                    .HasRequired(y => y.X)
                    .WithMany(x => x.Y)
                    .HasForeignKey(y => y.XId);

                modelBuilder.Entity<X>()
                    .HasOptional(x => x.YOptional)
                    .WithOptionalDependent(y=> y.XOptional);
            }
        }
Run Code Online (Sandbox Code Playgroud)

Jul*_*man 5

您不能在两个实体之间建立关系,这两个实体的定义与两端不同.所以你不能从一个方向做1:*而从另一个方向做1:1.

让我猜一下,你真的不希望它从依赖端是1:1.从那一端起,它总是只指向一件事.

在映射中,与生活不同,除非你有多对多,否则孩子只有一个父母.

但是,您可以创建0..1:*relationaship(零或一对多).父母可以有一个或多个孩子(例如"很多"),但孩子可以在没有父母的情况下存在,但是父母可以永远不会有多个孩子(例如"零或一个").

这是使您的类产生[零或一个]到多个关系的最简单方法.请注意,我在类Y中使外键成为可以为null的int.通过此设置,EF约定将生成一个映射,使子节点不存在父节点.

public class X
  {
    [Key]
    public int XId { get; set; }
    public ICollection<Y> Y { get; set; }

  }

  public class Y
  {
    [Key]
    public int YId { get; set; }
    public int? XId { get; set; }
    public X X { get; set; }
  }

  public class DataContext : DbContext
  {
    public DbSet<X> XSet { get; set; }
    public DbSet<Y> YSet { get; set; }
   }
Run Code Online (Sandbox Code Playgroud)

以下是从上述类和上下文派生的可视化模型的屏幕截图.我认为这可以实现你所寻求的行为,如果我猜你可能只是以不同的方式感知它是正确的.

在此输入图像描述